echarts图例legend 限制最少显示一个图例

遇到一个需求,就是如何保证echarts图表里至少显示一个图例的数据(也就是最后一个图例不能变成unselected的状态)
下图是最初加载时的画面

clipboard.png
不想出现图例都被点击取消导致图表只有一个坐标轴,太丑了

clipboard.png
在发帖前查阅了一些思路:

  • 有用单选模式曲线救国的,但是就没有办法看到多条图例的数据在同一个图表里显示
  • 有图例为最后一个的时候,禁用所有图例的点击事件

都不是能够很好的解决,找到一个可以参考的代码


var option = {
    title: {
        text: '折线图堆叠'
    },
    tooltip: {
        trigger: 'axis'
    },
    legend: {
        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',
            stack: '总量',
            data:[120, 132, 101, 134, 90, 230, 210]
        },
        {
            name:'联盟广告',
            type:'line',
            stack: '总量',
            data:[220, 182, 191, 234, 290, 330, 310]
        },
        {
            name:'视频广告',
            type:'line',
            stack: '总量',
            data:[150, 232, 201, 154, 190, 330, 410]
        },
        {
            name:'直接访问',
            type:'line',
            stack: '总量',
            data:[320, 332, 301, 334, 390, 330, 320]
        },
        {
            name:'搜索引擎',
            type:'line',
            stack: '总量',
            data:[820, 932, 901, 934, 1290, 1330, 1320]
        }
    ]
};
myChart.setOption(option);
myChart.on('legendselectchanged', function (params) {
    let option = this.getOption();
    let select_key = Object.keys(params.selected);
    if (!params.selected[params.name]) {
        select_key.map(res => {
            option.legend[0].selected[res] = !params.selected[res];
        });
    } else {
        select_key.map(res => {
            option.legend[0].selected[res] = false;
        });
        option.legend[0].selected[params.name] = true;
    }
    this.setOption(option)
});

输入到http://echarts.baidu.com/exam... 的代码框里可以看到效果,基本上算是手动多选切换成了单选,但是成单选后就无法多选,所以我想问有没有什么方法可以实现需求,或者获取最后一个图例的对象后,只禁用该对象的点击事件

阅读 11.2k
2 个回答

自己解决了,下附解决思路及部分代码。
思路:当选择最后一个图例的时候,将其selected的值改为true就可以了,之前附的参考代码改一改就实现了
代码如下:

myChart.on('legendselectchanged', function (params) {
        let option = this.getOption();
        let select_key = Object.keys(params.selected);
        let select_value = Object.values(params.selected);
        console.log('select_value',select_value,'length',select_value.length)
        var n = 0;
        select_value.map(res => {
            if(!res){
                n++;
            }
        });
        console.log('n',n)
        if( n ==select_value.length){
            option.legend[0].selected[params.name] = true;
        }
                            
        this.setOption(option)
});

完美解决,回头再整理博客

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题