最近想在Vue的项目里尝试使用d3.js,封装一些经常使用的图表。这里记录一下本身搭建项目的过程,以及实现一个简单的柱形图。不了解D3的请移步D3 Data-Driven Documents,它是基于数据驱动文档工做方式的一款JavaScript函数库,主要用于网页做图、生成互动图形,是最流行的可视化库之一。vue
使用vue-cli搭建单页应用:webpack
# 安装 vue-cli
$ npm install --global vue-cli
# 使用 "webpack" 模板建立一个新项目
$ vue init webpack d3-vue
# 安装依赖,而后开始!
$ cd d3-vue
$ npm run dev
复制代码
D3安装(最新的v5版本):ios
$ npm install d3 --save
复制代码
D3引入:git
$ import * as d3 from 'd3'
复制代码
在vue中能够经过给标签添加ref属性,而后在js中利用this.$refs去引用它,从而操做该dom元素github
<template>
<div>
<h3>一个简单的图表</h3>
<svg ref="baseBarChart" class="base-bar-chart"></svg>
</div>
</template>
// 省略的代码...
var chartSvg = d3.select(this.$refs.baseBarChart)
复制代码
矩形图主要构成部分有矩形、坐标轴和文字说明,咱们须要的数据有图表的数据、图表宽度和矩形宽度web
// 设置图表数据,图表宽度和矩形宽度
var chartData = this.chartData
var width = this.width
var barHeight = this.barHeight
复制代码
要绘图,首先须要的是一块绘图的画布。D3提供了众多的SVG图形的生成器,咱们在这里使用SVG画布。选择文档中的svg元素,这里用到了$refs属性vue-router
// 画布
var chartSvg = d3.select(this.$refs.baseBarChart)
.attr('width', width)
.attr('height', barHeight * chartData.length)
复制代码
d3.scaleLinear(),线性比例尺,将一个连续的区间映射到另外一区间。绘图时若是直接根据给出的数据给矩形的宽度赋值,有很大的局限性。好比一组数据里有一个数值为2000,咱们是不可能用2000个像素来表明矩形的宽度的,由于画布没有那么长。这个时候咱们就须要把某一区域的值映射到另外一区域,转换的过程当中大小关系不变。vue-cli
// x轴比例尺
var xScale = d3.scaleLinear()
.domain([0, d3.max(chartData)])
.range([0, width])
复制代码
在有数据却没有足够图形元素的时候,可使用如下链式方法添加足够的元素: selection.selectAll(element).data(data).enter().append(element)npm
// 矩形和label文字组合的容
var g = chartSvg.selectAll('g')
.data(chartData)
.enter().append('g')
.attr('transform', function (d, i) { return 'translate(0,' + i * barHeight + ')' })
复制代码
// 添加矩形
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 })
复制代码
绘制后的图形以下:axios
怎么使用咱们定义好的柱形图组件呢,分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数据请求。