使用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 相关文章推荐
JQuery学习笔录 简单的JQuery
Apr 09 Javascript
jQuery之字体大小的设置方法
Feb 27 Javascript
node.js集成百度UE编辑器
Feb 05 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
js基于myFocus实现轮播图效果
Feb 14 Javascript
jQuery图片缩放插件smartZoom使用实例详解
Aug 25 jQuery
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
Nov 02 Javascript
webstorm中vue语法的支持详解
May 09 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
Jul 24 Javascript
使用vue中的混入mixin优化表单验证插件问题
Jul 02 Javascript
详解ES6中class的实现原理
Oct 03 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
PHP实现图片简单上传
2006/10/09 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
url地址自动加#号问题说明
2010/08/21 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
JavaScript中九种常用排序算法
2014/09/02 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
2020/09/04 Javascript
python生成器的使用方法
2013/11/21 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
python的继承知识点总结
2018/12/10 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
Django分组聚合查询实例分享
2020/04/29 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
毕业生简单求职信
2013/11/19 职场文书
农村婚庆司仪主持词
2014/03/15 职场文书
小学二年级评语
2014/04/21 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
商务信函英语问候语
2015/11/10 职场文书
七年级作文之雪景
2019/11/18 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP