使用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小游戏实现代码
Aug 19 Javascript
jquery常用技巧及常用方法列表集合
Apr 06 Javascript
js中浮点型运算BUG的解决方法说明
Jan 06 Javascript
JavaScript自定义等待wait函数实例分析
Mar 23 Javascript
window.location.hash知识汇总
Nov 09 Javascript
AngularJS入门教程之过滤器用法示例
Nov 02 Javascript
jQuery元素选择器实例代码
Feb 06 Javascript
JS实现浏览上传文件的代码
Aug 23 Javascript
vue 自定义 select内置组件
Apr 10 Javascript
ES6 对象的新功能与解构赋值介绍
Feb 05 Javascript
React如何实现浏览器打印部分内容详析
May 19 Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 Javascript
详解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
PHP7之Mongodb API使用详解
2015/12/26 PHP
CI框架的安全性分析
2016/05/18 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
Python日志模块logging简介
2015/04/13 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
Python编程中类与类的关系详解
2019/08/08 Python
python验证码图片处理(二值化)
2019/11/01 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
家长对孩子的寄语
2015/02/26 职场文书
升职自荐信范文
2015/03/27 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
活动总结模板大全
2015/05/11 职场文书
贫困生证明范文
2015/06/16 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
MySQL存储过程及语法详解
2022/08/05 MySQL