echart柱状图堆叠总计显示

本文主要记录一下使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值