1、实现效果
左边是类别、数量,中间类似于进度条,右边是所占百分比

2、实现思路
x轴不显示,y轴的axisLabel用富文本,显示机器与台数;图表有两个数据组,分别用蓝色和灰色表示,两个柱子重合,灰色柱子在蓝色柱子下面;灰色柱子的label用富文本,显示占比。
3、实现代码
(1)在template里写个容器
<div class="chartStyle" ref="chartImplement"></div>
在style里定义容器的大小
.chartStyle {
height: 300px;
width: 700px;
}
(2)在data里声明一个变量
myChartLine:'',
在methods里写个配置图表的函数,输入参数为dataAll,包含了机具的类型、数量、占比等信息。数据格式为
dataAll = {
dataX: dataX,//类别
dataY: dataY,//数量
dataSum: dataSum,//总数
dataPercent: dataPercent,//占比
}
initSchedule(dataAll) {
let _this = this;
this.myChartLine = echarts.init(this.$refs.chartImplement)
let myColor = ['#3C83FF']
var option = {
grid: {
left: '25%',
right: '15%',
},
xAxis: {
type: 'value',
splitLine: {
show: false
},
axisLabel: {
show: false
},
axisTick: {
show: false
},
axisLine: {
show: false
},
},
yAxis: {
type: 'category',
axisTick: {
show: false
},
axisLine: {
show: false
},
axisLabel: {
color: 'rgba(0,0,0,.7)',
fontSize: 14,
formatter: function(data) {
var traceValue;
for (var i = 0; i < dataAll.dataX.length; i++) {
if (data === dataAll.dataX[i]) {
traceValue = dataAll.dataY[i]
break
}
}
var arr = [
'{a|' + data + '}',
'{b|' + traceValue + '}',
'{c|台}'
]
return arr.join('')
},
textStyle: {
rich: {
a: {
fontSize: 14,
width: 100
},
b: {
fontSize: 14,
align: 'center',
color: '#3C83FF',
fontWeight: 600,
},
c: {
padding: [0, 0, 0, 5],
fontSize: 14,
align: 'center',
}
}
},
},
data: dataAll.dataX
},
series: [
{
name: '%',
type: 'bar',
barWidth: 15,
data: dataAll.dataPercent,
label: {
show: true,
position: 'right',
offset: [0, -40],
formatter: function(data) {
return '';
},
color: 'rgba(0,0,0,.7)',
fontSize: 26
},
itemStyle: {
normal: {
barBorderRadius: 10,
color: function(params) {
let num = myColor.length;
return myColor[params.dataIndex % num];
},
}
},
zlevel: 1
},
{
name: '进度条背景',
type: 'bar',
label: {
show: true,
position: 'right',
offset: [0, 0],
formatter: function(data) {
var traceValue;
for (var i = 0; i < dataAll.dataX.length; i++) {
if (data.name === dataAll.dataX[i]) {
traceValue = dataAll.dataPercent[i]
break
}
}
var arr = [
'{a|' + traceValue + '}',
'{b|%}'
]
return arr.join('');
},
textStyle: {
rich: {
a: {
fontSize: 14,
color: 'rgba(0,0,0,0.7)',
fontWeight: 560,
padding: [0, 0, 0, 15],
},
b: {
fontSize: 14,
color: 'rgba(0,0,0,0.7)',
padding: [0, 0, 0, 3],
align: 'center',
},
}
},
},
barGap: '-100%',
barWidth: 15,
data: dataAll.dataSum,
color: '#DEE0E3',
itemStyle: {
normal: {
barBorderRadius: 10
}
}
},
]
};
this.myChartLine.setOption(option, true);
window.addEventListener("resize", () => {
if (this.myChartLine) {
this.myChartLine.resize();
}
});
},
(3)调用该函数
这里假设有100台机器,初始化数据
initData() {
var dataX = ['旋耕机1', '旋耕机2', '旋耕机3', '旋耕机4', '旋耕机5']
var dataY = ['30', '20', '15', '25', '10'];
var dataPercent = ['30', '20', '15', '25', '10'];
var dataSum = new Array(dataX.length).fill(100);
var data = {
dataX: dataX,
dataY: dataY,
dataSum: dataSum,
dataPercent: dataPercent,
}
this.initSchedule(data);
},
在mounted中调用initData
mounted() {
this.initData();
},
完成