使用D3.js+Vue實(shí)現(xiàn)一個(gè)簡(jiǎn)單的柱形圖
最近想在Vue的項(xiàng)目里嘗試使用d3.js,封裝一些常用的圖表。這里記錄一下自己搭建項(xiàng)目的過(guò)程,以及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的柱形圖。不了解D3的請(qǐng)移步D3 Data-Driven Documents,它是基于數(shù)據(jù)驅(qū)動(dòng)文檔工作方式的一款JavaScript函數(shù)庫(kù),主要用于網(wǎng)頁(yè)作圖、生成互動(dòng)圖形,是最流行的可視化庫(kù)之一。
說(shuō)明
- 采用Vue-cli腳手架快速搭建項(xiàng)目
- npm 安裝 D3
- 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的柱形圖
項(xiàng)目搭建
使用vue-cli搭建單頁(yè)應(yīng)用:
# 安裝 vue-cli $ npm install --global vue-cli # 使用 "webpack" 模板創(chuàng)建一個(gè)新項(xiàng)目 $ vue init webpack d3-vue # 安裝依賴,然后開始! $ cd d3-vue $ npm run dev
D3安裝(最新的v5版本):
$ npm install d3 --save
D3引入:
$ import * as d3 from 'd3'
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖表
1.在Vue中獲取dom元素
在vue中可以通過(guò)給標(biāo)簽添加ref屬性,然后在js中利用this.$refs去引用它,從而操作該dom元素
<template> <div> <h3>一個(gè)簡(jiǎn)單的圖表</h3> <svg ref="baseBarChart" class="base-bar-chart"></svg> </div> </template> // 省略的代碼... var chartSvg = d3.select(this.$refs.baseBarChart)
2.設(shè)置圖表數(shù)據(jù)
矩形圖主要構(gòu)成部分有矩形、坐標(biāo)軸和文字說(shuō)明,我們需要的數(shù)據(jù)有圖表的數(shù)據(jù)、圖表寬度和矩形寬度
// 設(shè)置圖表數(shù)據(jù),圖表寬度和矩形寬度 var chartData = this.chartData var width = this.width var barHeight = this.barHeight
3.添加畫布
要繪圖,首先需要的是一塊繪圖的畫布。D3提供了眾多的SVG圖形的生成器,我們?cè)谶@里使用SVG畫布。選擇文檔中的svg元素,這里用到了$refs屬性
// 畫布
var chartSvg = d3.select(this.$refs.baseBarChart)
.attr('width', width)
.attr('height', barHeight * chartData.length)
4.x軸比例尺
d3.scaleLinear(),線性比例尺,將一個(gè)連續(xù)的區(qū)間映射到另一區(qū)間。繪圖時(shí)如果直接根據(jù)給出的數(shù)據(jù)給矩形的寬度賦值,有很大的局限性。比如一組數(shù)據(jù)里有一個(gè)數(shù)值為2000,我們是不可能用2000個(gè)像素來(lái)代表矩形的寬度的,因?yàn)楫嫴紱]有那么長(zhǎng)。這個(gè)時(shí)候我們就需要把某一區(qū)域的值映射到另一區(qū)域,轉(zhuǎn)換的過(guò)程中大小關(guān)系不變。
// x軸比例尺 var xScale = d3.scaleLinear() .domain([0, d3.max(chartData)]) .range([0, width])
5.矩形和label文字的容器,用于添加元素
在有數(shù)據(jù)卻沒有足夠圖形元素的時(shí)候,可以使用以下鏈?zhǔn)椒椒ㄌ砑幼銐虻脑?
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導(dǎo)入
2.設(shè)置數(shù)據(jù)
3.通過(guò)屬性值傳遞給子組件
<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
}
}
}
}
路由配置和數(shù)據(jù)請(qǐng)求
剩下的一部分就是各個(gè)頁(yè)面的vue-router路由配置和主頁(yè)的axios數(shù)據(jù)請(qǐng)求。

項(xiàng)目地址:d3-vue
總結(jié)
以上所述是小編給大家介紹的使用D3.js+Vue實(shí)現(xiàn)一個(gè)簡(jiǎn)單的柱形圖,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
vuex存儲(chǔ)數(shù)據(jù)的幾種方法實(shí)例詳解
在瀏覽網(wǎng)頁(yè)時(shí)我們有些時(shí)候需要記住一些用戶選擇的信息,比如登陸時(shí)我們?nèi)绻x擇了記住密碼,那么我們下次進(jìn)入該網(wǎng)頁(yè)時(shí)就會(huì)有你上次的登陸信息,下面這篇文章主要給大家介紹了關(guān)于vuex存儲(chǔ)數(shù)據(jù)的幾種方法,需要的朋友可以參考下2022-10-10
如何解決前端上傳Formdata中的file為[object?Object]的問(wèn)題
文件上傳是Web開發(fā)中常見的功能之一,下面這篇文章主要給大家介紹了關(guān)于如何解決前端上傳Formdata中的file為[object?Object]問(wèn)題的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
解決vue admin element noCache設(shè)置無(wú)效的問(wèn)題
今天小編就為大家分享一篇解決vue admin element noCache設(shè)置無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Vue實(shí)現(xiàn)Chrome小恐龍游戲的示例代碼
Google 給 Chrome 瀏覽器加了一個(gè)有趣的彩蛋,本文就詳細(xì)的介紹一下Vue實(shí)現(xiàn)Chrome小恐龍游戲的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2022-04-04
vue watch監(jiān)聽數(shù)據(jù)變化的案例詳解
監(jiān)聽數(shù)據(jù)變化,在Vue中是通過(guò)偵聽器來(lái)實(shí)現(xiàn)的,你也可以將它理解為監(jiān)聽器,時(shí)刻監(jiān)聽某個(gè)數(shù)據(jù)的變化,本文將通過(guò)代碼示例為大家詳細(xì)的介紹一下vue watch如何監(jiān)聽數(shù)據(jù)變化,需要的朋友可以參考下2023-07-07
vue draggable resizable 實(shí)現(xiàn)可拖拽縮放的組件功能
這篇文章主要介紹了vue draggable resizable 實(shí)現(xiàn)可拖拽縮放的組件功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07

