介紹
基於 Vue2.0 和 echarts 封裝的 v-charts圖表元件
只需要統一提供一種對前後端都友好的資料格式設定簡單的配置項,便可輕鬆生成常見的圖表。
npm安裝
npm i v-charts echarts -S
複製程式碼
vue中引入使用
1.完整引入(使用過)
直接在main.js中引入,之後就可以在index.vue頁面中直接引入
// main.js
import Vue from 'vue'
import VCharts from 'v-charts'
import App from './App.vue'
Vue.use(VCharts)
new Vue({
el: '#app',
render: h => h(App)
})
複製程式碼
2.按需引入(該方法沒有嘗試)
v-charts的每種圖表元件,都已經單獨打包到lib資料夾下了
|- lib/
|- line.common.js -------------- 折線圖
|- bar.common.js --------------- 條形圖
|- histogram.common.js --------- 柱狀圖
|- pie.common.js --------------- 餅圖
|- ring.common.js -------------- 環圖
|- funnel.common.js ------------ 漏斗圖
|- waterfall.common.js --------- 瀑布圖
|- radar.common.js ------------- 雷達圖
|- map.common.js --------------- 地圖
|- sankey.common.js ------------ 桑基圖
|- heatmap.common.js ----------- 熱力圖
|- scatter.common.js ----------- 散點圖
|- candle.common.js ------------ k線圖
|- gauge.common.js ------------- 儀表盤
|- tree.common.js -------------- 樹圖
|- bmap.common.js -------------- 百度地圖
|- amap.common.js -------------- 高德地圖
複製程式碼
在main.js中引入後,可以直接將單個圖表引入到專案中的index.vue頁面
import Vue from 'vue'
import VeLine from 'v-charts/lib/line.common'
import App from './App.vue'
Vue.component(VeLine.name, VeLine)
new Vue({
el: '#app',
render: h => h(App)
})
複製程式碼
在專案中使用的基本配置
官方案例是直接在template中使用,使用v-指令+圖示名稱
<ve-line :data="chartData" width="100px" :events="chartEvents"></ve-line>
複製程式碼
本人使用的是pug模板,所以引入方式如下
ve-line.echarts(:height="heightElectric" // 設定canvas高度
:after-set-option="getConfig" // 設定鉤子函式
:data="chartData" // 設定圖示展示的資料
:extend="chartExtend" // 設定標識元素的屬性
:loading="loading" // 設定資料未載入的等待狀態
:settings="chartSettings" // 設定資料型別相關的屬性
:colors="color") // 設定圖表展示顏色和樣式
複製程式碼
echarts的屬性實在太多,這裡就只寫一下使用過的一些基本屬性,具體的屬性可以看
文件寫的還是很全的,基本的使用場景都能覆蓋
1.data屬性的設定
方式一.基本的使用
這是使用當前資料格式的折線圖
其他型別的統計圖的資料格式都是一樣的,格式都是標題colums和 資料rows{
columns: ['日期', '訪問使用者', '下單使用者'],
rows: [
{ '日期': '2018-05-22', '訪問使用者': 32371, '下單使用者': 19810 },
{ '日期': '2018-05-23', '訪問使用者': 12328, '下單使用者': 4398 },
{ '日期': '2018-05-24', '訪問使用者': 92381, '下單使用者': 52910 }
]
}
複製程式碼
方式二.設定別名的使用
實際專案中,肯定不會使用中文來當欄位名,返回的是英文欄位,但是我們又想展示的時候用中文展示標題,這個時候就需要在settings裡面設定別名,程式碼如下
<template>
<ve-line :data="chartData" :settings="chartSettings"></ve-line>
</template>
<script>
export default {
data () {
this.chartSettings = {
labelMap: {
PV: '訪問使用者',
Order: '下單使用者'
}
}
return {
chartData: {
columns: ['date', 'PV', 'Order'],
rows: [
{ 'date': '2018-05-22', 'PV': 32371, 'Order': 19810 },
{ 'date': '2018-05-23', 'PV': 12328, 'Order': 4398 },
{ 'date': '2018-05-24', 'PV': 92381, 'Order': 52910 }
]
}
}
}
}
複製程式碼
我們看下效果
如果是單個資料的統計圖,colums只需要傳一組資料,rows也只需要傳一組資料就行2.extends屬性的設定
我們看下基本的屬性配置
配置項 | 簡介 | 型別 | 備註 |
---|---|---|---|
dimension | 維度 | string | 預設 columns[0] |
metrics | 指標 | array | 預設 [columns[0], columns[1]] |
dataType | 資料型別 | object | - |
xAxisType | x軸型別 | string | 可選值: category, value, time, log |
xAxisName | x軸標題 | string | - |
yAxisName | y軸標題 | string | - |
digit | 設定資料型別為percent時保留的位數 | number | 預設為2 |
labelMap | 設定指標的別名 | object | - |
legendName | 設定圖表上方圖例的別名 | object | - |
tooltipTrigger | 提示框的觸發方式 | string | 可選值: item, axis |
axisVisible | 是否顯示座標軸 | boolean | - |
symbolSizeMax | 氣泡最大值 | number | 預設為50 |
symbol | 標記的圖形 | string | 內容參考文件 |
symbolSize | 標記的大小 | number, array, Function | 內容參考文件 |
symbolRotate | 標記的旋轉角度 | number | 內容參考文件 |
symbolOffset | 標記相對於原本位置的偏移 | array | 內容參考文件 |
cursor | 滑鼠懸浮時在圖形元素上時滑鼠的樣式 | string | 內容參考文件 |
scale | 是否是脫離 0 值比例 | boolean | - |
min | y軸最小值 | number | - |
max | y軸最大值 | number | - |
雙y軸的extend屬性設定
this.chartExtend = {
tooltip: { // 修改提示框樣式
trigger: 'axis',
formatter: function(params){ // 自定義X軸座標點對應的label
return params[0].axisValue + "</br>" +
"<div style='float: left'> "+ params[0].seriesName +":"+ params[0].data[1] + "V" +"</div>" +
"</br><div style='float: left'> "+ params[1].seriesName +":"+ params[1].data[1] + "A" +"</div>";
},
},
series: {},
axisVisible: false, // 是否顯示座標軸
scale: [true],
legend: { // 標題的展示位置
left: 'right',
show: true,
textStyle: { // 標題的顏色
color: 'white'
}
},
xAxis: {// x軸設定
boundaryGap: false, // 是否貼邊顯示圖表
axisLabel: {
color: 'white'
}
},
yAxis (item) { // 因為是雙軸,所以需要指定雙軸的y軸樣式
item[0].splitLine = Object.assign ({}, {
lineStyle: { // 左y軸的顏色
color: ['#3755DA'],
}
});
item[0].axisLabel = Object.assign ({}, { // 左y軸的顏色 間隔線顏色
color: 'white'
});
item[0].nameTextStyle = Object.assign ({}, { // 左y軸的文字顏色
color: 'white',//正常是不用新增
});
item[1].splitLine = Object.assign ({}, {
show: false, // 是否展示右y軸,這是是不展示
lineStyle: { //右y軸的顏色
color: ['#3755DA'],
}
});
item[1].axisLabel = Object.assign ({}, { //右y軸的顏色 間隔線顏色
color: 'white'
});
item[1].nameTextStyle = Object.assign ({}, { //右y軸的文字顏色
color: 'white',//正常是不用新增
});
return item
},
grid: { // 設定圖表在canvas畫布的位置
top: '20%',
left: '3%',
right: '4%',
bottom: '2%',
},
}
複製程式碼
3.settings屬性的設定
setting的基本屬性
配置項 | 簡介 | 型別 | 備註 |
---|---|---|---|
dimension | 維度 | array | 預設columns第一項為維度 |
metrics | 指標 | array | 預設columns第二項起為指標 |
xAxisType | 橫軸的資料型別 | string | 可選值: category, value, time, log |
yAxisType | 左右座標軸資料型別 | array | 可選值: KMB, normal, percent |
yAxisName | 左右座標軸標題 | array | - |
axisSite | 指標所在的軸 | object | 預設不在right軸的指標都在left軸 |
stack | 堆疊選項 | object | - |
area | 是否展示為面積圖 | boolean | 預設為false |
scale | 是否是脫離 0 值比例 | array | 預設為[false, false],表示左右 兩個軸都不會脫離0值比例。 設定成 true 後坐標刻度不會 強制包含零刻度 |
min | 左右座標軸最小值 | array | - |
max | 左右座標軸最大值 | array | - |
digit | 設定資料型別為percent時保留的位數 | number | 預設為2 |
labelMap | 設定指標的別名,同時作用於提示框和圖例 | object | - |
legendName | 設定圖表上方圖例的別名 | object | - |
雙y軸需要指定右y軸的資料來源,我們看程式碼
this.chartSettings = {
labelMap: {
PV: '訪問使用者',
Order: '下單使用者'
},
axisSite: { // 定義右y軸的資料來源
right: ['Order']
},
}
return {
chartData: {
columns: ['date', 'PV', 'Order'],
rows: [
{ 'date': '2018-05-22', 'PV': 32371, 'Order': 19810 },
{ 'date': '2018-05-23', 'PV': 12328, 'Order': 4398 },
{ 'date': '2018-05-24', 'PV': 92381, 'Order': 52910 }
]
}
}
複製程式碼
雙y軸的堆疊面積圖效果如下
3.鉤子函式的設定
共有屬性中的鉤子函式用於在配置項生成過程中進行調整以及獲取例項。
配置項 | 說明 | 引數 |
---|---|---|
before-config | 對資料提前進行額外的處理, 在資料轉化為配置項開始前觸發 |
引數為 data,返回值為表格資料 |
after-config | 對生成好的echarts配置進行額外的處理, 在資料轉化為配置項結束後觸發 |
引數為 options,返回值為 echarts 配置 |
after-set-option | 生成圖之後獲取echarts例項 | 引數為echarts例項 |
after-set-option-once | 生成圖後獲取echarts例項 (只執行一次) |
引數為echarts例項 |
如果你想是一個如圖一樣的效果怎麼辦,這個時候就需要用到after-set-option這個鉤子函式
我們首先需要寫一個定時器用來獲取資料,獲取完資料之後,就需要用到這個鉤子函式來定時重新整理圖表所在canvas/**
* 處理重新整理後的echarts圖表
* @param e
*/
getConfig(e) {
if (this.chartDataElectric.rows.length > 6 ) { // 如果資料長度大於6,則刪除第一條資料
this.chartDataElectric.rows.splice(0,1)
}
e.setOption(this.chartDataElectric) //重新整理圖表
},
複製程式碼
參考文章: