echarts折线堆叠图图例分页 | 8月更文挑战

1,093 阅读3分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

这个是效果,简陋了一些,没有数据了:

主要是实现右边图例进行分页的,因为这个堆叠图图例太多,横着展示不美观,所以要改成分页,方便查看,悬停的时候也会有各个图例的值,在网上搜了很多,但是效果都不是特别好,而且还要改源码好几个地方,会影响其他的堆叠折线图啥的,所以分享一下自己探索出来的功能,好像也是echarts自带的,不过当时搜了很久才发现,文档上也没有特别体现出来。

1、首先定义div,定义了min-width是因为有时候切换页面或者什么的时候echarts图表会缩小,不知道你们有没有用到过,我这里就是用的就是jquery和layui样式。

<div id="ddtEchart" style="width: 100%;min-width: 1200px;height: 700px;"></div>

2、开始调接口获取数据,我这里直接定义res的值模拟了,可以根据自己接口返回的值进行数据组装,x轴数组,图例数组等

//查询堆叠图信息
function searchddtInfo() {
    var myChart = echarts.init(document.getElementById("ddtEchart"));
    let legendArr = [];
    let xArr = ["00:00", "01:00", "02:00", "03:00", "04:00", "05:00", "06:00", "07:00", "08:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00"];;
    let seriesData = [];
    let res = {
        "堆叠图1":[{"name":"aa",val:"1"}],
        "堆叠图2":[{"name":"bb",val:"2"}],
        "堆叠图3":[{"name":"cc",val:"3"}],
        "堆叠图4":[{"name":"dd",val:"4"}],
        "堆叠图5":[{"name":"ee",val:"5"}],
        "堆叠图6":[{"name":"ff",val:"6"}]
    }
    for(let key in res) {
        legendArr.push(key);
        let seriesArr = {
            name: key,
            data: [],
            type: 'line',
            symbol:'circle',
            symbolSize:8,
            showSymbol: false,
            areaStyle: {},
            emphasis: {
                focus: 'series'
            }
        };
        if(res[key].length > 0) {
            for(let i = 0;i<res[key].length;i++) {
                seriesArr.data.push(res[key][i].val);
            }
        }
        seriesData.push(seriesArr);
    }
    
    let myChartOptions =  {
        //定义颜色,echarts也会给你自动分配颜色,这里写了颜色为了好看
        color: ["#b88fca","#ea0472","#fda986","#9a003c","#2743c5","#f0a3db","#75be9c","#9dd3e8","#879bd7","#c52727","#c55127","#c57627","#c5a927","#aec527","#75be9c","#48c527","#27c54f","#27c589","#27c5c3","#279bc5","#2776c5","#fbd88a","#3e27c5","#6a27c5","#9d27c5","#c527ac","#c5276a","#c52746","#ffe700","#22b3f1","#c30c0c","#209607","#03839c","#063ece","#4611d4"],
        title: {
            text: '堆叠图',
            left:'center'
        },
        tooltip: {//悬停样式
            trigger: 'axis',
            axisPointer: {
                type: "cross",
                label: {
                    formatter: function (params) {
                        if (params.seriesData.length === 0) {
                            window.mouseCurValue = params.value;
                        }
                    }
                }
            },
            formatter: function (params) {
                let res = "", sum = 0;
                for (let i = 0; i < params.length; i++) {
                    let series = params[i];
                    sum += Number(series.data);
                    if (sum >= window.mouseCurValue) {
                        res = series.axisValue + "<br/>" + series.marker + series.seriesName + ":" + series.data + "<br/>";
                        break;
                    }
                }
                return res;
            },
        },
        legend: {
            textStyle: {
                width:'250',
                overflow: 'break'
            },
            right:0,
            top: 5, //距离顶部距离
            orient: 'vertical', //水平还是垂直的意思
            data: legendArr,
            type: 'scroll', //分页类型
            height: 665,
            pageIconColor: '#1eb2f1', //翻页箭头颜色
            pageTextStyle:{
                color: '#222', //翻页数字颜色
            }, //翻页数字设置
            pageIconSize: 18
        },
        dataZoom: [
            {
                id: 'dataZoomX',
                type: 'inside',
                xAxisIndex: 0,
            }
        ],
        grid: {
            left: '3%',
            right: '20%',
            bottom: '3%',
            containLabel: true
        },
        xAxis: [
            {
                type: 'category',
                boundaryGap: false,
                data: xArr
            }
        ],
        yAxis: [
            {
                type: 'value',
                axisLabel: {
                    formatter: '{value}'
                }
            }
        ],
        series: seriesData
    };
    myChart.setOption(myChartOptions, true);
}

3、主要在legend这里,设置垂直分页,水平分页好像也可以,就是左右切换的,用的是最新的echarts.js,只能设置切换分页的按钮大小和翻转数字的颜色。

图例的颜色可以不用定义,echarts会自动渲染不同的颜色,我这里有需求要求所以写死了,但是如果数据量过多,这点颜色都不够用的!

然后主要就是悬停的时候只展示当前的折线图的这个时刻,不要展示其他所有的图例的当前时刻,所以在tooltip对象里写了formatter,通过params拿到当前悬停的图例信息,并且存到windows对象中,因为存到其他地方后面还要重新定义一直修改会报错,然后循环通过判断所有图例信息是否和window.mouseCurValue一样,就停止循环,这里可以看tooltip里写的代码

主要就是这些,是之前写的,当时花了好几天改这个bug,现在复盘一下,还是感觉挺简单的,不知道当时为什么想不出这么好的办法,哈哈。