使用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 相关文章推荐
如何在Web页面上直接打开、编辑、创建Office文档
Mar 12 Javascript
通过JS获取用户本地图片路径并显示的代码
Feb 16 Javascript
JavaScript中的单引号和双引号报错的解决方法
Sep 01 Javascript
js实现图片无缝滚动
Dec 23 Javascript
如何实现星星评价(jquery.raty.js插件)
Dec 21 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
微信小程序之页面拦截器的示例代码
Sep 07 Javascript
VueRouter导航守卫用法详解
Dec 25 Javascript
web前端页面生成exe可执行文件的方法
Feb 08 Javascript
原生js实现淘宝放大镜效果
Oct 28 Javascript
微信小程序实现弹出菜单动画
Jun 21 Javascript
小程序选项卡以及swiper套用(跨页面)
Jun 19 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 xml常用函数的集合(比较详细)
2013/06/06 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
2015/04/03 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
js实现返回顶部效果
2017/03/10 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
Python实现从URL地址提取文件名的方法
2015/05/15 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
python实现单链表的方法示例
2019/09/03 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
信用社员工先进事迹材料
2014/02/04 职场文书
工作决心书范文
2014/03/11 职场文书
村安全生产责任书
2014/08/25 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
Python学习之os包使用教程详解
2022/03/21 Python
SQL Server 中的事务介绍
2022/05/20 SQL Server