开源前端JS框架eChars折线堆叠图一键联动反选全部legend+series功能实现

说明:
折线堆叠图专业名词:
legend - 图例,用于展示有哪些项目的数量变化趋势将会被展现到折线堆叠图上。
series - 折线,用于展示legend项目的数量变化趋势。

一、需求

1.1 demo准备

根据echarts的原生折线堆叠图,前往:https://echarts.baidu.com/examples/editor.html?c=line-stack
下载html,去掉引入的api数据源并注释掉stack:‘总量’(不让数据累加,而是独立显示)所在行即可。通过浏览器打开如下:
在这里插入图片描述

1.2 问题所在

如果使用者想要观察单个图例(legend)对应的折线(series)的变化趋势,由于legend和series是属于联动选择的关系,那么此时需要在点击其他legend,使其选择状态为false,从而只留下想看的legend对应的series,如下图:
在这里插入图片描述
如图,如果我们只想观察“搜索引擎”的数量变化趋势,那么需要点击四次,才能反选其他legend,并擦除它们对应的series,只留下“搜索引擎”的折线图。

1.3 期望改进效果

增加一个“清除”按钮,当点击此按钮时,图上所有legend被反选,所有series消失;但是,在反选后,可以重新选择单个legend观察其对应的单条series,即反选功能既要做到数据清空,又要做到数据正确恢复。如下图:
第一步:点击清空,legend全部变暗,折线全部消失
在这里插入图片描述
在这里插入图片描述
第二步:可以点击legend,查看单条series
在这里插入图片描述

二、代码实现

2.1 上述demo反选实现代码

line-stack.html

<!DOCTYPE html>
<html style="height: 100%">
<head>
<meta charset="utf-8">
</head>
<body style="height: 100%; margin: 0">
<button id="button" onclick="clear()">清空</button>
<div id="container" style="height: 100%"></div>
   <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script>
   <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-gl/echarts-gl.min.js"></script>
   <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-stat/ecStat.min.js"></script>
   <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/dataTool.min.js"></script>
   <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script>
   <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/world.js"></script>
   <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/bmap.min.js"></script>
   <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/simplex.js"></script>
   <script type="text/javascript">

        var dom = document.getElementById("container");
        var myChart = echarts.init(dom);
        var app = {};
        option = null;
        option = {
            title: {
                text: '折线图堆叠'
            },
            tooltip: {
                trigger: 'axis'
            },
            legend: {
                selected: {
                    '邮件营销': true,
                    '联盟广告': true,
                    '视频广告': true,
                    '直接访问': true,
                    '搜索引擎': true
                },
                data:['邮件营销','联盟广告','视频广告','直接访问','搜索引擎']
            },
            // grid: {
            //     left: '3%',
            //     right: '4%',
            //     bottom: '3%',
            //     containLabel: true
            // },
            toolbox: {
                feature: {
                    saveAsImage: {}
                }
            },
            xAxis: {
                type: 'category',
                boundaryGap: false,
                data: ['周一','周二','周三','周四','周五','周六','周日']
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    name:'邮件营销',
                    type:'line',
                    data:[120, 132, 101, 134, 90, 230, 210]
                },
                {
                    name:'联盟广告',
                    type:'line',
                    data:[220, 182, 191, 234, 290, 330, 310]
                },
                {
                    name:'视频广告',
                    type:'line',
                    data:[150, 232, 201, 154, 190, 330, 410]
                },
                {
                    name:'直接访问',
                    type:'line',
                    data:[320, 332, 301, 334, 390, 330, 320]
                },
                {
                    name:'搜索引擎',
                    type:'line',
                    data:[820, 932, 901, 934, 1290, 1330, 1320]
                }
            ]
        };
        if (option && typeof option === "object") {
            myChart.setOption(option, true);
        }
        var btn = document.getElementById("button");
        var isClear = false;
        // 清空数据
        btn.onclick = function(){
            for(var key in option.legend.selected) {
                option.legend.selected[key] = false;
            }
            isAllClear = true;
            myChart.setOption(option, true);
        };
   </script>

</body>
</html>

2.2 将demo的方法应用至实战项目

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>后台管理系统</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script>
    <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-gl/echarts-gl.min.js"></script>
    <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-stat/ecStat.min.js"></script>
    <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/dataTool.min.js"></script>
    <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script>
    <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/world.js"></script>
    <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/simplex.js"></script>
    <script type="text/javascript" src="js/form-counters.js"></script>
</head>
<body>
    <input type="datetime-local" id="startTime4Line"> to
    <input type="datetime-local" id="endTime4Line">
    <input type="button" id="button_fcLine" value="按起始时间查询"/>
    <button id="clearFcLine">清空图例和折线</button>
    <div id="fcLine" style="width: 1200px; height: 800px"></div>
    <form id="form_fcPie">
        <input type="datetime-local" id="time4Pie">
        <input type="button" id="button_fcPie" value="按时间查询">
    </form>
    <div id="fcPie" style="width: 1200px; height: 800px"></div>
</body>
</html>

form-counter.js

var rootPath = "/bpm-manager"
var jsonArrData = [];
var isAllClear = false;
$(function () {
    var fcLine = echarts.init(document.getElementById('fcLine'));

    $.ajax({
        method:'GET',
        url: rootPath + "/form/counters/map/title-date-count",
        success: function (data) {
            handleFcLine(fcLine, data);
        }
    });

    $('#button_fcLine').click(function () {
        var startTime = $('#startTime4Line').val().replace('T', ' ');
        var endTime = $('#endTime4Line').val().replace('T', ' ');

        if(startTime.length === 0) {
            alert('请输入起始日期');
            return;
        }

        $.ajax({
            method:'GET',
            url: rootPath + "/form/counters/map/title-date-count?startTime=" + startTime +
                "&endTime=" + endTime,
            success: function (data) {
                handleFcLine(fcLine, data);
            }
        });
    });

    $('#button_fcPie').click(function () {
            var time = $('#time4Pie').val();
            time = time.replace('T', ' ');
            $.ajax({
                method: "GET",
                url: rootPath + "/form/counters/map/title-count?time=" + time,
                success: function(data) {
                    var fcPie = echarts.init(document.getElementById('fcPie'));
                    var nameArr = [];
                    var jsonArr = [];
                    var i = 0;

                    $.each(data, function (name, count) {
                        nameArr[i] = name;
                        jsonArr[i] = {value: count, name: name};
                        i++;
                    });

                    var option = {
                        title: {
                            text: '每月表单比例统计',
                            subtext: time + '数据',
                            left: 'center'
                        },
                        tooltip: {
                            trigger: 'item',
                            formatter: "{a} <br/>{b} : {c} ({d}%)"
                        },
                        legend: {
                            // orient: 'vertical',
                            // top: 'middle',
                            bottom: 10,
                            left: 'center',
                            data: nameArr
                        },
                        series: [
                            {
                                type: 'pie',
                                radius: '65%',
                                center: ['50%', '50%'],
                                selectedMode: 'single',
                                data: jsonArr,
                                itemStyle: {
                                    emphasis: {
                                        shadowBlur: 10,
                                        shadowOffsetX: 0,
                                        shadowColor: 'rgba(0, 0, 0, 0.5)'
                                    }
                                }
                            }
                        ]
                    };

                    if (option && typeof option === "object") {
                        fcPie.setOption(option, true);
                    }

                }
            })
        }
    );

});

function handleFcLine(fcLine, data) {
    var nameArr = [];
    var dateArr = [];
    var jsonArr = [];
    var i = 0;
    $.each(data, function (name, dateCountMap) {
        var j = 0;
        var countArr = [];
        nameArr[i] = name;
        $.each(dateCountMap, function (date, count) {
            dateArr[j] = date;
            countArr[j] = count;
            j++;
        });
        jsonArr[i] = {
            name: name,
            type: 'line',
            data: countArr
        };
        i++;
    });

    var option = {
        tooltip: {
            trigger: 'item',
            axisPointer: {
                type: 'cross'
            }
        },
        legend: {
            selected: {

            },
            data: nameArr
        },
        grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },
        toolbox: {
            feature: {
                saveAsImage: {}
            }
        },
        xAxis: {
            type: 'category',
            boundaryGap: false,
            data: dateArr
        },
        yAxis: {
            type: 'value'
        },
        series: jsonArr
    };

    $.each(nameArr, function (name) {
        option.legend.selected[name] = true;
    });

    if (option && typeof option === "object") {
        fcLine.setOption(option, true);
    }

    $('#clearFcLine').click(function () {
        nameArr.forEach(function (name) {
            option.legend.selected[name] = false;
        });
        fcLine.setOption(option, true);
    });

}
发布了79 篇原创文章 · 获赞 322 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_15329947/article/details/88601255
今日推荐