本文主要记录一下使用echart的柱状图堆叠时,需要在柱状图顶部显示总计数值的问题。参考一篇文章的实现,它的实现方式是替换最后一列的formater属性来达到实现总计的方式。我的实现方式是使用再堆叠一个柱状图的形式来显示标签,具体为 颜色为透明色,标签位于内部下方(insideBottom),然后是重写tooltip的formatter(使其不显示总计的数值),最后就是在触发legend切换时,更换option.缺点是切换legend触发事件时需要重新设置option并更改总计数值的逻辑。
一.结果
二.代码实现
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts1</title>
<!-- 引入 echarts.js -->
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.0.0/echarts.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="width: 1600px;height:800px;"></div>
<script type="text/javascript">
function formatNum(strNum) {
if (strNum.length <= 3) {
return strNum;
}
if (!/^(\+|-)?(\d+)(\.\d+)?$/.test(strNum)) {
return strNum;
}
var a = RegExp.$1,
b = RegExp.$2,
c = RegExp.$3;
var re = new RegExp();
re.compile("(\\d)(\\d{3})(,|$)");
while (re.test(b)) {
b = b.replace(re, "$1,$2$3");
}
return a + "" + b + "" + c;
}
var heavyIn = [100,200,300,400,500];
var heavyOut = [600,400,200,100,460];
var emptyIn = [300,100,200,200,300];
var emptyOut = [420,230,280,320,480];
var sumIn =[];
var sumOut =[];
for(var i in heavyIn)
sumIn.push(heavyIn[i]+emptyIn[i]);
for(var i in heavyOut)
sumOut.push(heavyOut[i]+emptyOut[i]);
var myChart7 = echarts.init(document.getElementById("main"));
var colorList = ['#5ad9a6', '#cef2e4', '#ceddfe', '#7babff']
var left = '7.85%';
var right = '3%';
option = {
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function (params) {
var res = '<div><p>' + params[0].name + '</p ></div>';
for (var i = 0; i < params.length; i++) {
if (i == 4 || i == 5)
;
else {
res += "<p><font color=" + params[i].color + ">● " + "</font>" + params[i].seriesName + ':' + params[i].data + '</p >';
}
}
return res;
}
},
legend: {
data: ['进口重箱', '进口空箱', '出口重箱', '出口空箱'],
right: '2%',
},
grid: {
left: left,
right: right,
top: '15%',
bottom: '10%',
},
xAxis: [
{
type: 'category',
data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
}
],
yAxis: [
{
type: 'value',
axisLine: {
show: false
},
axisLabel: {
color: '#666666'
},
axisTick: {
show: false
}
}
],
series: [
{
name: '进口重箱',
type: 'bar',
data: heavyIn,
stack: '进口',
color: colorList[3],
barGap: '80%'
},
{
name: '进口空箱',
type: 'bar',
stack: '进口',
data: emptyIn,
color: colorList[2],
barGap: '80%'
},
{
name: '出口重箱',
type: 'bar',
stack: '出口',
data: heavyOut,
color: colorList[0],
barGap: '80%'
},
{
name: '出口空箱',
type: 'bar',
stack: '出口',
data: emptyOut,
color: colorList[1],
barGap: '80%'
},
{
name: '进口总量',
type: 'bar',
stack: '进口',
data: sumIn,
color: 'transparent',
label: {
position: 'insideBottom',
show: true,
color: '#666666',
formatter: function (param) {
return formatNum(param.value);
}
},
},
{
name: '出口总量',
type: 'bar',
stack: '出口',
data: sumOut,
color: 'transparent',
label: {
show: true,
position: 'insideBottom',
color: '#666666',
formatter: function (param) {
return formatNum(param.value);
}
},
},
]
};
myChart7.on("legendselectchanged", function (obj) {
var selected = obj.selected;
sumIn = [];
sumOut = [];
if (selected.进口重箱 == false && selected.进口空箱 == false) {
for (var i in emptyIn) {
sumIn.push(0);
}
}
if (selected.进口重箱 == true && selected.进口空箱 == false) {
for (var i in emptyIn) {
sumIn.push(heavyIn[i]);
}
}
if (selected.进口重箱 == false && selected.进口空箱 == true) {
for (var i in emptyIn) {
sumIn.push(emptyIn[i]);
}
}
if (selected.进口重箱 == true && selected.进口空箱 == true) {
for (var i in emptyIn) {
sumIn.push(emptyIn[i] + heavyIn[i]);
}
}
if (selected.出口重箱 == false && selected.出口空箱 == false) {
for (var i in emptyOut) {
sumOut.push(0);
}
}
if (selected.出口重箱 == true && selected.出口空箱 == false) {
for (var i in emptyOut) {
sumOut.push(heavyOut[i]);
}
}
if (selected.出口重箱 == false && selected.出口空箱 == true) {
for (var i in emptyOut) {
sumOut.push(emptyOut[i]);
}
}
if (selected.出口重箱 == true && selected.出口空箱 == true) {
for (var i in emptyOut) {
sumOut.push(emptyOut[i] + heavyOut[i]);
}
}
option = {
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function (params) {
var res = '<div><p>' + params[0].name + '</p ></div>';
for (var i = 0; i < params.length; i++) {
if (i == 4 || i == 5)
;
else {
res += "<p><font color=" + params[i].color + ">● " + "</font>" + params[i].seriesName + ':' + params[i].data + '</p >';
}
}
return res;
}
},
legend: {
data: ['进口重箱', '进口空箱', '出口重箱', '出口空箱'],
right: '2%',
},
grid: {
left: left,
right: right,
top: '15%',
bottom: '10%',
},
xAxis: [
{
type: 'category',
data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
}
],
yAxis: [
{
type: 'value',
axisLine: {
show: false
},
axisLabel: {
color: '#666666'
},
axisTick: {
show: false
}
}
],
series: [
{
name: '进口重箱',
type: 'bar',
data: heavyIn,
stack: '进口',
color: colorList[3],
barGap: '80%'
},
{
name: '进口空箱',
type: 'bar',
stack: '进口',
data: emptyIn,
color: colorList[2],
barGap: '80%'
},
{
name: '出口重箱',
type: 'bar',
stack: '出口',
data: heavyOut,
color: colorList[0],
barGap: '80%'
},
{
name: '出口空箱',
type: 'bar',
stack: '出口',
data: emptyOut,
color: colorList[1],
barGap: '80%'
},
{
name: '进口总量',
type: 'bar',
stack: '进口',
data: sumIn,
color: 'transparent',
label: {
position: 'insideBottom',
show: true,
color: '#666666',
formatter: function (param) {
return formatNum(param.value);
}
},
},
{
name: '出口总量',
type: 'bar',
stack: '出口',
data: sumOut,
color: 'transparent',
label: {
show: true,
position: 'insideBottom',
color: '#666666',
formatter: function (param) {
return formatNum(param.value);
}
},
},
]
};
myChart7.setOption(option);
})
myChart7.setOption(option);
window.addEventListener("resize", function () {
var left = '7.85%';
var right = '3%';
option = {
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function (params) {
var res = '<div><p>' + params[0].name + '</p ></div>';
for (var i = 0; i < params.length; i++) {
if (i == 4 || i == 5)
;
else {
res += "<p><font color=" + params[i].color + ">● " + "</font>" + params[i].seriesName + ':' + params[i].data + '</p >';
}
}
return res;
}
},
legend: {
data: ['进口重箱', '进口空箱', '出口重箱', '出口空箱'],
right: '2%',
},
grid: {
left: left,
right: right,
top: '15%',
bottom: '10%',
},
xAxis: [
{
type: 'category',
data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
}
],
yAxis: [
{
type: 'value',
axisLine: {
show: false
},
axisLabel: {
color: '#666666'
},
axisTick: {
show: false
}
}
],
series: [
{
name: '进口重箱',
type: 'bar',
data: heavyIn,
stack: '进口',
color: colorList[3],
barGap: '80%'
},
{
name: '进口空箱',
type: 'bar',
stack: '进口',
data: emptyIn,
color: colorList[2],
barGap: '80%'
},
{
name: '出口重箱',
type: 'bar',
stack: '出口',
data: heavyOut,
color: colorList[0],
barGap: '80%'
},
{
name: '出口空箱',
type: 'bar',
stack: '出口',
data: emptyOut,
color: colorList[1],
barGap: '80%'
},
{
name: '进口总量',
type: 'bar',
stack: '进口',
data: sumIn,
color: 'transparent',
label: {
posion: 'insideBottom',
show: true,
color: '#666666',
formatter: function (param) {
return formatNum(heavyIn[param.dataIndex] + emptyIn[param.dataIndex]);
}
},
},
{
name: '出口总量',
type: 'bar',
stack: '出口',
data: sumOut,
color: 'transparent',
label: {
show: true,
posion: 'insideBottom',
color: '#666666',
formatter: function (param) {
return formatNum(heavyOut[param.dataIndex] + emptyOut[param.dataIndex]);
}
},
},
]
};
myChart7.setOption(option);
myChart7.resize();
});
</script>
</body>
</html>
三.参考文章
1.https://blog.csdn.net/qq_36612779/article/details/78810107