搜索
您的当前位置:首页正文

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

2020-11-27 来源:抵帆知识网

最近想在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 })

    绘制后的图形如下:

     

    使用该组件

    怎么使用我们定义好的柱形图组件呢,分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-vue

    总结

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

    Top