最近想在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实现一个简单的柱形图,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】