詳解vue使用Echarts畫(huà)柱狀圖
1 引入Echarts
1.1 安裝
使用如下命令通過(guò) npm 安裝 ECharts
npm install echarts --save
注:本文安裝Echarts版本為:“echarts”: “5.2.1”
1.2 引入
安裝完成以后,可以將echarts全部引入,這樣一來(lái),我們可以在該頁(yè)面使用echarts所有組件;引入代碼如下:
import * as echarts from "echarts";
2 基本柱狀圖
柱狀圖(或稱(chēng)條形圖)是一種通過(guò)柱形的長(zhǎng)度來(lái)表現(xiàn)數(shù)據(jù)大小的一種常用圖表類(lèi)型。
設(shè)置柱狀圖的方式,是將配置項(xiàng)中 series 的 type 設(shè)為 'bar',該
最簡(jiǎn)單的柱狀圖可以這樣設(shè)置:
option = {
xAxis: {
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {},
series: [
{
type: 'bar',
data: [23, 24, 18, 25, 27, 28, 25]
}
]
};
如圖所示:

上圖vue完整代碼如下:
<template>
<div class="echart" id="mychart" :style="myChartStyle"></div>
</template>
<script>
import * as echarts from "echarts";
export default {
data() {
return {
xData: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], //橫坐標(biāo)
yData: [23, 24, 18, 25, 27, 28, 25], //數(shù)據(jù)
myChartStyle: { float: "left", width: "100%", height: "400px" } //圖表樣式
};
},
mounted() {
this.initEcharts();
},
methods: {
initEcharts() {
// 基本柱狀圖
const option = {
xAxis: {
data: this.xData
},
yAxis: {},
series: [
{
type: "bar", //形狀為柱狀圖
data: this.yData
}
]
};
const myChart = echarts.init(document.getElementById("mychart"));
myChart.setOption(option);
//隨著屏幕大小調(diào)節(jié)圖表
window.addEventListener("resize", () => {
myChart.resize();
});
}
}
};
</script>
3 多列柱狀圖
當(dāng)有多列數(shù)據(jù)需要展示時(shí)我們需要使用多列柱狀圖,只需要在 series 多添加一項(xiàng)就可以了:
series: [
{
type: "bar", //形狀為柱狀圖
data: data1,
},
{
type: "bar", //形狀為柱狀圖
data: data2,
}
]
通常有多列數(shù)據(jù)的時(shí)候,我們需要對(duì)每列使用不同顏色展示并在柱狀圖進(jìn)行說(shuō)明,echarts默認(rèn)會(huì)使用不同顏色進(jìn)行區(qū)分,當(dāng)然我們也可以對(duì)柱狀圖的樣式進(jìn)行設(shè)置,如背景色等;但若需要標(biāo)明某一列代表什么數(shù)據(jù),需要使用到圖例legend,對(duì)應(yīng)在 series 數(shù)組對(duì)象中添加name屬性,來(lái)對(duì)應(yīng)legend中的data,其中通過(guò)位置元素來(lái)設(shè)置圖例的位置,如下:
// 圖例
legend: {
data: ["人數(shù)", "任務(wù)數(shù)"],
top: "0%" // 設(shè)置圖例位置在頂部
},
series: [
{
type: "bar", //形狀為柱狀圖
data: data1,
name: "人數(shù)", // legend屬性
{
type: "bar", //形狀為柱狀圖
data: data2,
name: "任務(wù)數(shù)", // legend屬性
}
]
設(shè)置多列柱狀圖如圖:

上圖對(duì)應(yīng)完整vue代碼如下:
<template>
<div class="echart" id="mychart" :style="myChartStyle"></div>
</template>
<script>
import * as echarts from "echarts";
export default {
data() {
return {
xData: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], //橫坐標(biāo)
yData: [23, 24, 18, 25, 27, 28, 25], //人數(shù)數(shù)據(jù)
taskDate: [10, 11, 9, 17, 14, 13, 14],
myChartStyle: { float: "left", width: "100%", height: "400px" } //圖表樣式
};
},
mounted() {
this.initEcharts();
},
methods: {
initEcharts() {
// 多列柱狀圖
const mulColumnZZTData = {
xAxis: {
data: this.xData
},
// 圖例
legend: {
data: ["人數(shù)", "任務(wù)數(shù)"],
top: "0%"
},
yAxis: {},
series: [
{
type: "bar", //形狀為柱狀圖
data: this.yData,
name: "人數(shù)", // legend屬性
label: {
// 柱狀圖上方文本標(biāo)簽,默認(rèn)展示數(shù)值信息
show: true,
position: "top"
}
},
{
type: "bar", //形狀為柱狀圖
data: this.taskDate,
name: "任務(wù)數(shù)", // legend屬性
label: {
// 柱狀圖上方文本標(biāo)簽,默認(rèn)展示數(shù)值信息
show: true,
position: "top"
}
}
]
};
const myChart = echarts.init(document.getElementById("mychart"));
myChart.setOption(mulColumnZZTData);
//隨著屏幕大小調(diào)節(jié)圖表
window.addEventListener("resize", () => {
myChart.resize();
});
}
}
};
</script>
其中 series中的label屬性為柱狀圖文本標(biāo)簽,可顯示數(shù)據(jù)、文本等信息,默認(rèn)不展示,需要將其show設(shè)置為true時(shí)才會(huì)在圖中展示出來(lái)。
4 柱狀圖樣式設(shè)置
4.1 柱條樣式
柱條的樣式可以通過(guò) series.itemStyle 設(shè)置,包括:
- 柱條的顏色(
color); - 柱條的寬度(
barWidth); - 柱條的描邊顏色(
borderColor)、寬度(borderWidth)、樣式(borderType); - 柱條的背景色(
showBackground)柱條圓角的半徑(barBorderRadius); - 柱條透明度(
opacity); - 陰影(
shadowBlur、shadowColor、shadowOffsetX、shadowOffsetY)。
我們可以對(duì)同一個(gè)系列柱條設(shè)置同一樣式,也可以對(duì)單一柱條設(shè)置特定的樣式,如下:
option = {
xAxis: {
data: ["A", "B", "C", "D", "E"]
},
yAxis: {},
series: [
{
type: "bar",
data: [
10,
22,
28,
{
value: 43,
// 設(shè)置單個(gè)柱子的樣式
itemStyle: {
color: "#91cc75",
shadowColor: "#91cc75",
borderType: "dashed",
opacity: 0.5
}
},
49
],
barWidth: "20%", // 每個(gè)柱條的寬度就是類(lèi)目寬度的 20%
// 同系列柱條樣式
itemStyle: {
barBorderRadius: 5,
borderWidth: 1,
borderType: "solid",
borderColor: "#73c0de",
shadowColor: "#5470c6",
shadowBlur: 3
}
}
]
};
效果如下:

4.2 柱條間距
柱條間距分為兩種,一種是不同系列在同一類(lèi)目下的距離 barWidth,另一種是類(lèi)目與類(lèi)目的距離 barCategoryGap。
示例如下:
option = {
xAxis: {
data: ["A", "B", "C", "D", "E"]
},
yAxis: {},
series: [
{
type: "bar",
data: [23, 24, 18, 25, 18],
barGap: "0%", // 兩個(gè)柱子之間的距離相對(duì)于柱條寬度的百分比;
barCategoryGap: "40%" // 每側(cè)空余的距離相對(duì)于柱條寬度的百分比
},
{
type: "bar",
data: [12, 14, 9, 9, 11]
}
]
};
以上示例如圖:

在這個(gè)例子中,barGap 被設(shè)為 '0%',這意味著每個(gè)類(lèi)目(比如 A)下的兩個(gè)柱子之間的距離,相對(duì)于柱條寬度的百分比,設(shè)置成0%說(shuō)明兩個(gè)柱跳之間沒(méi)有間隙。而 barCategoryGap 是 '40%',意味著柱條每側(cè)空余的距離,相對(duì)于柱條寬度的百分比。
通常而言,設(shè)置 barGap 及 barCategoryGap 后,就不需要設(shè)置 barWidth 了,這時(shí)候的寬度會(huì)自動(dòng)調(diào)整。如果有需要的話(huà),可以設(shè)置 barMaxWidth 作為柱條寬度的上限,當(dāng)圖表寬度很大的時(shí)候,柱條寬度也不會(huì)太寬。
在同一坐標(biāo)系上,此屬性會(huì)被多個(gè)柱狀圖系列共享。此屬性應(yīng)設(shè)置于此坐標(biāo)系中最后一個(gè)柱狀圖系列上才會(huì)生效,并且是對(duì)此坐標(biāo)系中所有柱狀圖系列生效。
以上效果vue代碼如下:
<template>
<div class="echart" id="mychart" :style="myChartStyle"></div>
</template>
<script>
import * as echarts from "echarts";
export default {
data() {
return {
myChart: {},
myChartStyle: { float: "left", width: "100%", height: "400px" }, //圖表樣式
};
},
mounted() {
this.initEcharts();
},
methods: {
initEcharts() {
// 樣式設(shè)置
// const option = {
// xAxis: {
// data: ["A", "B", "C", "D", "E"]
// },
// yAxis: {},
// series: [
// {
// type: "bar",
// data: [
// 10,
// 22,
// 28,
// {
// value: 43,
// // 設(shè)置單個(gè)柱子的樣式
// itemStyle: {
// color: "#91cc75",
// shadowColor: "#91cc75",
// borderType: "dashed",
// opacity: 0.5
// }
// },
// 49
// ],
// barWidth: "20%", // 每個(gè)柱條的寬度就是類(lèi)目寬度的 20%
// // 同系列柱條樣式
// itemStyle: {
// barBorderRadius: 5,
// borderWidth: 1,
// borderType: "solid",
// borderColor: "#73c0de",
// shadowColor: "#5470c6",
// shadowBlur: 3
// }
// }
// ]
// };
// 柱條間距
const option = {
xAxis: {
data: ["A", "B", "C", "D", "E"]
},
yAxis: {},
series: [
{
type: "bar",
data: [23, 24, 18, 25, 18],
barGap: "0%", // 兩個(gè)柱子之間的距離相對(duì)于柱條寬度的百分比;
barCategoryGap: "40%" // 每側(cè)空余的距離相對(duì)于柱條寬度的百分比
},
{
type: "bar",
data: [12, 14, 9, 9, 11]
}
]
};
const myChart = echarts.init(document.getElementById("mychart"));
myChart.setOption(option);
//隨著屏幕大小調(diào)節(jié)圖表
window.addEventListener("resize", () => {
myChart.resize();
});
}
}
};
</script>
5 動(dòng)態(tài)排序柱狀圖
動(dòng)態(tài)排序柱狀圖是一種展示隨時(shí)間變化的數(shù)據(jù)排名變化的圖表,從 ECharts 5 開(kāi)始內(nèi)置支持。
動(dòng)態(tài)排序柱狀圖通常是橫向的柱條,如果想要采用縱向的柱條,只要把本教程中的 X 軸和 Y 軸相反設(shè)置即可。
實(shí)現(xiàn)動(dòng)態(tài)排序柱狀圖需要使用以下屬性:
yAxis.realtimeSort 設(shè)為 true,表示開(kāi)啟 Y 軸的動(dòng)態(tài)排序效果
yAxis.inverse 設(shè)為 true,表示 Y 軸從下往上是從小到大的排列
yAxis.animationDuration 建議設(shè)為 300,表示第一次柱條排序動(dòng)畫(huà)的時(shí)長(zhǎng)
yAxis.animationDurationUpdate 建議設(shè)為 300,表示第一次后柱條排序動(dòng)畫(huà)的時(shí)長(zhǎng)
如果想只顯示前 n 名,將 yAxis.max 設(shè)為 n - 1,否則顯示所有柱條
xAxis.max 建議設(shè)為 'dataMax' 表示用數(shù)據(jù)的最大值作為 X 軸最大值,視覺(jué)效果更好
如果想要實(shí)時(shí)改變標(biāo)簽,需要將 series.label.valueAnimation 設(shè)為 true
animationDuration 設(shè)為 0,表示第一份數(shù)據(jù)不需要從 0 開(kāi)始動(dòng)畫(huà)(如果希望從 0 開(kāi)始則設(shè)為和 animationDurationUpdate 相同的值)
animationDurationUpdate 建議設(shè)為 3000 表示每次更新動(dòng)畫(huà)時(shí)長(zhǎng),這一數(shù)值應(yīng)與調(diào)用 setOption 改變數(shù)據(jù)的頻率相同
以 animationDurationUpdate 的頻率調(diào)用 setInterval,更新數(shù)據(jù)值,顯示下一個(gè)時(shí)間點(diǎn)對(duì)應(yīng)的柱條排序
實(shí)現(xiàn)效果如下:

上圖vue完整代碼如下:
```js
<template>
<div class="echart" id="mychart" :style="myChartStyle"></div>
</template>
<script>
import * as echarts from "echarts";
export default {
data() {
return {
myChart: {},
sortData: [], //動(dòng)態(tài)排序數(shù)據(jù)
myChartStyle: { float: "left", width: "100%", height: "400px" }, //圖表樣式
dynamicSortZZTOption: {
xAxis: {
max: "dataMax"
},
yAxis: {
type: "category",
data: ["A", "B", "C", "D", "E"],
inverse: true,
animationDuration: 300,
animationDurationUpdate: 300,
max: 4 // only the largest 3 bars will be displayed
},
series: [
{
realtimeSort: true,
name: "動(dòng)態(tài)變化",
type: "bar",
data: [],
label: {
show: true,
position: "right",
valueAnimation: true
}
}
],
legend: {
show: true
},
animationDuration: 3000,
animationDurationUpdate: 3000,
animationEasing: "linear",
animationEasingUpdate: "linear"
}
};
},
mounted() {
// 圖表初始化
this.myChart = echarts.init(document.getElementById("mychart"));
// 數(shù)據(jù)初始化
for (let i = 0; i < 5; ++i) {
this.sortData.push(Math.round(Math.random() * 200));
}
// 數(shù)據(jù)刷新
setInterval(() => {
this.pageUpdate();
}, 3000);
},
methods: {
// 數(shù)據(jù)刷新
pageUpdate() {
console.log(this.dynamicSortZZTOption.series[0].data);
this.dynamicSortZZTOption.series[0].data = this.sortData;
for (let i = 0; i < this.sortData.length; ++i) {
if (Math.random() > 0.9) {
this.sortData[i] += Math.round(Math.random() * 2000);
} else {
this.sortData[i] += Math.round(Math.random() * 200);
}
}
this.myChart.setOption(this.dynamicSortZZTOption);
//隨著屏幕大小調(diào)節(jié)圖表
window.addEventListener("resize", () => {
this.myChart.resize();
});
}
}
};
</script>
```
6 總結(jié)
以上列了vue引用Echarts畫(huà)柱狀圖幾種主要使用方式,有了以上幾種使用基礎(chǔ),我們就可以做一些更加復(fù)雜的場(chǎng)景,如國(guó)家地區(qū)GDP時(shí)間變化、疫情數(shù)據(jù)統(tǒng)計(jì)渲染等。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- vue實(shí)現(xiàn)echarts餅圖/柱狀圖點(diǎn)擊事件實(shí)例
- vue echarts實(shí)現(xiàn)橫向柱狀圖
- Vue使用Echarts實(shí)現(xiàn)立體柱狀圖
- vue echarts實(shí)現(xiàn)柱狀圖動(dòng)態(tài)展示
- vue+echarts實(shí)現(xiàn)進(jìn)度條式柱狀圖
- vue+echarts實(shí)現(xiàn)堆疊柱狀圖
- vue+echart實(shí)現(xiàn)雙柱狀圖
- vue+Echart實(shí)現(xiàn)立體柱狀圖
- Vue3中實(shí)現(xiàn)Chart.js柱狀圖的超詳細(xì)指南
相關(guān)文章
解決vue報(bào)錯(cuò)'超出最大堆棧大小'問(wèn)題
這篇文章主要介紹了解決vue報(bào)錯(cuò)'超出最大堆棧大小'問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
element-ui中dialog彈窗關(guān)閉按鈕失效的解決
這篇文章主要介紹了element-ui中dialog彈窗關(guān)閉按鈕失效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Vue.js實(shí)現(xiàn)高質(zhì)量翻頁(yè)功能的完整開(kāi)發(fā)指南
當(dāng)我們?cè)诰W(wǎng)頁(yè)中展示大量數(shù)據(jù)時(shí),分頁(yè)能幫助用戶(hù)快速瀏覽內(nèi)容,提高頁(yè)面的加載性能和用戶(hù)體驗(yàn),本文將從基礎(chǔ)翻頁(yè)功能入手,逐步升級(jí)至可復(fù)用的分頁(yè)組件,并提供性能優(yōu)化和用戶(hù)體驗(yàn)提升的實(shí)用建議,需要的朋友可以參考下2025-07-07

