echarts柱状图、折线图求合,通过formatter回调函数自定义tooltip展示格式

前一篇文章写了思路一:给series集合末尾多加一栏用于展示合计,但缺点较多,所以又想了另一个方法。
思路二:通过tooltip中的函数formatter自定义鼠标触发时的展示格式,先看展示效果
最底下加了合计一栏

当我们去掉“安卓”选项时:合计的值也动态的改变了

好了,接下来就看实际的代码吧:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ECharts2</title>
    <!-- 引入 echarts.js -->
  <script src="https://cdn.bootcss.com/echarts/3.5.4/echarts.min.js"></script>
</head>
<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main" style="width:1600px;height:800px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));

        // 指定图表的配置项和数据
        var option = {
                    tooltip : {
                        trigger :'axis',
                        axisPointer : {
                            type : 'line'
                        },
                        formatter:''        //思路二:给tooltip一个函数,点击的时候展示数据

                    },
                    title: {
                        text:'xxx激活设备数',
                        left:'left' ,
                        top:'10px',
                        textStyle: {
                        color: '#666',
                        fontWeight: 'normal'
                        }
                    },
                    toolbox: {
                        feature: {
                        dataView: {show: true, readOnly: false},
                        magicType: {show: true, type: ['line', 'bar']},
                        restore: {show: true},
                        saveAsImage: {show: true}
                        }
                    },
                    grid: {
                        y: '10%',
                        y2: '10%'
                    },
                     legend: {
                        data:['安卓','诺基亚','苹果']
                    },
                    xAxis:{
                        type: 'category',
                        axisLabel:{
                        interval: 0,    // {number}
                        rotate: 40
                        },
                        data: ['星期三','星期四','星期五']
                        },
                    yAxis:{
                        type: 'value',
                        min: 0,
                        interval: 10000
                    },
                    series: [
                        {
                            name:'安卓',
                            type:'line',
                            stack:'xxx',
                            itemStyle: {
                                normal: {
                                    color: '#548dd5'
                                }
                            },
                            data:  [["星期三",10000],["星期四",15000],["星期五",20000]]
                        },
                        {
                            name:'诺基亚',
                            type:'line',
                            stack:'xxx',
                            itemStyle: {
                                normal: {
                                    color: '#000'
                                }
                            },

                            data:  [["星期三",11000],["星期四",16000],["星期五",25000]]
                        },
                        {
                            name:'苹果',
                            type:'line',
                            stack:'xxx',
                            itemStyle: {
                                normal: {
                                    color: '#e56c0a'
                                }
                            },

                            data:  [["星期三",12000],["星期四",18000],["星期五",28000]]
                        }
                    ]
        };

        //替换formatter
                                var fun = function (params) { 
                                    var myseries = option.series;
                                    var chartType = option.odao_admin.chart_type;
                                    var data3 =0; 
                                    var axis =[];
                                    for(var i=0,l=params.length;i<l;i++){ 
                                        for (var j = 0; j < myseries.length; j++) {  
                                            if(myseries[j].name == params[i].seriesName){  
                                                axis.push(params[i].axisValue)
                                                var res = axis[0] +'</br>'; //取对应x轴的值
                                            }  
                                        }  
                                    } 
                                    for(var i=0,l=params.length;i<l;i++){ 
                                        for (var j = 0; j < myseries.length; j++) {  
                                            if(myseries[j].name == params[i].seriesName){
                                                var color = params[i].color;
                                                if(chartType == 'bar_back'){
                                                    res += '<span style=" font-size:22px;color:'+ color +';">'+' ● '+'</span>' +  params[i].seriesName +' : '+params[i].data[0]+'</br>';    //添加颜色并赋值
                                                }else{
                                                    res += '<span style=" font-size:22px;color:'+ color +';">'+' ● '+'</span>' +  params[i].seriesName +' : '+params[i].data[1]+'</br>';    //添加颜色并赋值
                                                } 
                                            }  
                                        }  
                                    } 
                                    for(var i=0,l=params.length;i<l;i++){
                                        if(chartType == 'bar_back'){                
                                            data3 += params[i].data[0]  //反转图重新计算总和
                                        }else{
                                            data3 += params[i].data[1]
                                        }
                                    } 
                                    var res =res + '<span style="font-size:22px;color:black;">'+' ● '+'</span>' + ' 合计:' +data3;
                                    return res;  
                                }
        //加载页面时候替换tooltip的formatter
        option["tooltip"]["formatter"] = fun 
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);

        //legend点击事件,根据传过来的obj.selected得到状态是true的params对应的series的下标,再去计算总和
        myChart.on("legendselectchanged", function(obj) {

                var changefun = function (params) {
                var b = obj.selected
                , d = [];
                var data3 =0;
                var myseries = option.series;
                var chartType = option.odao_admin.chart_type;
                var axis =[];
                for(var i=0,l=params.length;i<l;i++){ 
                    for (var j = 0; j < myseries.length; j++) {  
                        if(myseries[j].name == params[i].seriesName){  
                            axis.push(params[i].axisValue)
                            var res = axis[0] +'</br>'; //取x轴的值
                        }  
                    }  
                } 
                for(var i=0,l=params.length;i<l;i++){ 
                    for (var j = 0; j < myseries.length; j++) {  
                        if(myseries[j].name == params[i].seriesName){ 
                            var color = params[i].color;
                            if(chartType == 'bar_back'){
                                res += '<span style=" font-size:22px;color:'+ color +';">'+' ● '+'</span>' +  params[i].seriesName +' : '+params[i].data[0]+'</br>';    //反转图添加颜色并赋值
                            }else{
                                res += '<span style=" font-size:22px;color:'+ color +';">'+' ● '+'</span>' +  params[i].seriesName +' : '+params[i].data[1]+'</br>';    //添加颜色并赋值
                            } 
                        }  
                    }  
                } 
                for(var key in b){
                    if(b[key]){
                        for(var i=0,l=params.length;i<l;i++){  
                            var changename = params[i].seriesName; 
                            if(changename == key){ 
                                d.push(i);      //得到状态是true的legend对应的params的下标
                            }
                        }
                    }
                }
                for(var i=0,l=d.length;i<l;i++){
                    for(var j=0,h=params.length;j<h;j++){
                        if(d[i] == j){
                            if(chartType == 'bar_back'){                
                                data3 += params[i].data[0]  //反转图重新计算总和
                            }else{
                                data3 += params[i].data[1]
                            }
                        }
                    }
                }
                var res =res + '<span style="font-size:22px;color:black;">'+' ● '+'</span>' + ' 合计:' +data3;
                return res;  
            }
                option["tooltip"]["formatter"] = fun1
                myChart.setOption(option);
        })


    </script>
</body>
</html>

代码有点长,有看不懂的地方,欢迎各位留言,我会尽量解答。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值