使用D3.js+Vue实现一个简单的柱形图


Posted in Javascript onAugust 05, 2018

最近想在Vue的项目里尝试使用d3.js,封装一些常用的图表。这里记录一下自己搭建项目的过程,以及实现一个简单的柱形图。不了解D3的请移步D3 Data-Driven Documents,它是基于数据驱动文档工作方式的一款JavaScript函数库,主要用于网页作图、生成互动图形,是最流行的可视化库之一。

说明

  • 采用Vue-cli脚手架快速搭建项目
  • npm 安装 D3
  • 实现一个简单的柱形图

项目搭建

使用vue-cli搭建单页应用:

# 安装 vue-cli
$ npm install --global vue-cli
# 使用 "webpack" 模板创建一个新项目
$ vue init webpack d3-vue
# 安装依赖,然后开始!
$ cd d3-vue
$ npm run dev

D3安装(最新的v5版本):

$ npm install d3 --save

D3引入:

$ import * as d3 from 'd3'

实现一个简单的图表

1.在Vue中获取dom元素

在vue中可以通过给标签添加ref属性,然后在js中利用this.$refs去引用它,从而操作该dom元素

<template>
 <div>
  <h3>一个简单的图表</h3>
  <svg ref="baseBarChart" class="base-bar-chart"></svg>
 </div>
</template>
// 省略的代码...
var chartSvg = d3.select(this.$refs.baseBarChart)

2.设置图表数据

矩形图主要构成部分有矩形、坐标轴和文字说明,我们需要的数据有图表的数据、图表宽度和矩形宽度

// 设置图表数据,图表宽度和矩形宽度
 var chartData = this.chartData
 var width = this.width
 var barHeight = this.barHeight

3.添加画布

要绘图,首先需要的是一块绘图的画布。D3提供了众多的SVG图形的生成器,我们在这里使用SVG画布。选择文档中的svg元素,这里用到了$refs属性

// 画布
 var chartSvg = d3.select(this.$refs.baseBarChart)
 .attr('width', width)
 .attr('height', barHeight * chartData.length)

4.x轴比例尺

d3.scaleLinear(),线性比例尺,将一个连续的区间映射到另一区间。绘图时如果直接根据给出的数据给矩形的宽度赋值,有很大的局限性。比如一组数据里有一个数值为2000,我们是不可能用2000个像素来代表矩形的宽度的,因为画布没有那么长。这个时候我们就需要把某一区域的值映射到另一区域,转换的过程中大小关系不变。

// x轴比例尺
 var xScale = d3.scaleLinear()
 .domain([0, d3.max(chartData)])
 .range([0, width])

5.矩形和label文字的容器,用于添加元素
在有数据却没有足够图形元素的时候,可以使用以下链式方法添加足够的元素:

selection.selectAll(element).data(data).enter().append(element)
// 矩形和label文字组合的容
var g = chartSvg.selectAll('g')
 .data(chartData)
 .enter().append('g')
 .attr('transform', function (d, i) { return 'translate(0,' + i * barHeight + ')' })

6.添加矩形和label文字

// 添加矩形
 g.append('rect')
 .attr('width', xScale)
 .attr('height', barHeight - 2)
 .attr('fill', 'green')
 // 添加label文字
 g.append('text')
 .attr('x', function (d) { return xScale(d) + 3 })
 .attr('y', barHeight - 10)
 .attr('dy', '0.3em')
 .attr('fill', 'red')
 .style('font-size', '12px')
 .text(function (d) { return d })

绘制后的图形如下:

使用D3.js+Vue实现一个简单的柱形图 

使用该组件

怎么使用我们定义好的柱形图组件呢,分3步走:

1. import导入

2.设置数据

3.通过属性值传递给子组件

<base-bar-chart :chart-data="barChart.data" :width="barChart.width" :bar-height="barChart.barHeight"></base-bar-chart>
import BaseBarChart from '../components/base-bar-chart'
export default {
 name: 'BaseBarChartView',
 components: {
  BaseBarChart
 },
 data () {
  return {
   barChart: {
    data: [4, 6, 12, 10, 8, 1, 9],
    width: 540,
    barHeight: 20
   }
  }
 }
}

路由配置和数据请求

剩下的一部分就是各个页面的vue-router路由配置和主页的axios数据请求。

使用D3.js+Vue实现一个简单的柱形图

项目地址:d3-vue

总结

以上所述是小编给大家介绍的使用D3.js+Vue实现一个简单的柱形图,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
JavaScript 创建对象和构造类实现代码
Jul 30 Javascript
jquery select选中的一个小问题
Oct 11 Javascript
fmt:formatDate的输出格式详解
Jan 09 Javascript
模拟一个类似百度google的模糊搜索下拉列表
Apr 15 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
Dec 10 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
Jun 20 Javascript
总结十个Angular.js由浅入深的面试问题
Aug 26 Javascript
vue.js 添加 fastclick的支持方法
Aug 28 Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 Javascript
原生JS实现前端本地文件上传
Sep 08 Javascript
javascript中call,apply,bind的区别详解
Dec 11 Javascript
基于vuex实现购物车功能
Jan 10 Vue.js
详解Require.js与Sea.js的区别
Aug 05 #Javascript
vue中关闭eslint的方法分析
Aug 04 #Javascript
详解Vue取消eslint语法限制
Aug 04 #Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
Aug 04 #Javascript
JavaScript中变量、指针和引用功能与操作示例
Aug 04 #Javascript
webpack4.x开发环境配置详解
Aug 04 #Javascript
微信小程序实现收藏与取消收藏切换图片功能
Aug 03 #Javascript
You might like
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
php实现数组重复数字统计实例
2018/09/30 PHP
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
python sort、sorted高级排序技巧
2014/11/21 Python
用python与文件进行交互的方法
2018/03/01 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
python http基本验证方法
2018/12/26 Python
python中实现控制小数点位数的方法
2019/01/24 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
C语言编程练习
2012/04/02 面试题
五年级英语教学反思
2014/01/31 职场文书
国窖1573广告词
2014/03/21 职场文书
公司年终奖分配方案
2014/06/16 职场文书
中学清明节活动总结
2014/07/04 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书