使用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 相关文章推荐
aspx中利用js实现确认删除代码
Jul 22 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
jQuery中first()方法用法实例
Jan 06 Javascript
jQuery unbind()方法实例详解
Jan 19 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
Feb 02 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
Jan 13 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 Javascript
js鼠标跟随运动效果
Mar 11 Javascript
微信小程序可滑动月日历组件使用详解
Oct 21 Javascript
微信小程序表单验证WxValidate的使用
Nov 27 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
Jul 22 Javascript
如何用threejs实现实时多边形折射
May 07 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
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
Date对象格式化函数代码
2010/07/17 Javascript
AngularJS快速入门
2015/04/02 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
Javascript验证方法大全
2015/09/21 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
2017/05/11 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
python如何把字符串类型list转换成list
2020/02/18 Python
python如何调用java类
2020/07/05 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
一套SQL笔试题
2016/08/14 面试题
几个常见的消息中间件(MOM)
2014/01/08 面试题
如何写毕业求职自荐信
2013/11/06 职场文书
工厂见习报告范文
2014/10/31 职场文书
2014年设计师工作总结
2014/11/25 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
使用 Apache 反向代理的设置技巧
2022/01/18 Servers
mybatis 获取更新记录的id
2022/05/20 Java/Android