echarts常见配置总结

616 阅读3分钟

最近工作中使用了不少echarts的图表,同时也解决了一些echarts的绘制和极端情况的处理,在这里记录一下。

柱状图标签过长导致部分标签不显示

当柱状图中data中的数据,有些数据过长,就会导致部分标签无法展示,如下图:

data: ['衬衫', '羊毛衫羊毛衫羊毛衫羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'],

20220428003949

针对这种情况,网上的解决方案有四种

  • 使用倾斜配置,将文本倾斜展示
axisLabel: {
    interval: 0,
    rotate: 20
}
  • 让文字竖直排列
axisLabel: {
    interval: 0,
    formatter:function(value) {
        return value.split("").join("\n");
    }
}
  • 编写自定义formatter,手动计算最大显示宽度以及省略号处理,具体代码直接百度
  • 设置隔个展示
axisLabel : {
    interval : 0,
    formatter : function(params,index){
        if (index % 2 != 0) {
            return '\n\n' + params;
        }
        else {
            return params;
        }
    }
}

以上的方案不是最佳的方式,最好的方法是echarts内置就支持当文本过程,可以自定义配置省略展示,折行显示等。

  • overflow:溢出处理,配合width使用,支持:'truncate' 截断,并在末尾显示ellipsis配置的文本,默认为'none', 'break' 单词换行 'breakAll' 超过宽度就换行

最终处理方案如下(需查看当前的echarts版本是否支持,以下在ecahrts5能生效):

    axisLabel: {
        width: 100, //设置标签宽度
        overflow: 'break', //超出宽度时折行显示
        interval: 0 //强制显示所有标签
    }

20220427231715

柱状图数据相差过大导致部分数据展示不全

在实际上的应用场景中,如柱状图是展示不同网卡的网络流量,有可能部分网卡的网络流量相对于其他网卡流量大一个数量级,此时,柱状图的展示就有明显的不协调,如下图:

20220427232001

而解决此问题有两种方案:

  • 设置yAxis的坐标系为对数系,使其能够展示差别大的数据,如下:
    yAxis: {
        type: 'log'
    }

20220427232240

但是使用对数坐标系会有以下几个问题:

  • 如果数据中没有包含0的数据,纵坐标不从0开始展示
  • 当数据中有0或者1时,数据展示存在问题,部分数据无法展示
  • 数据中含有负数,也会有展示问题

而解决方法则是手动修改值为0或值为1的数据,并且将1的数据改为0.在对应tooltip中进行数据的转换,总体比较复杂,具体可以参考echarts对数处理文章。

但是上面的数据是类别数据,因此不太适用使用对数方式来展示数据。可以针对不同的图表来设置最小展示,如柱状图,可以设置最小的柱高度,保证可以点击,如下:

series: [
    {
        name: '销量',
        type: 'bar',
        barMinHeight: 20,
        data: [33, 10000, 36, 10, 10, 20]
    }
]

20220428001110

多图表下的resize性能优化

在首页的场景中,如果是数据展示型的业务,会有很多的图表一起展示。而现阶段的图表的resize方法,基本是在window绑定resize,然后一改变就resize图表,如果图表比较复杂或者比较多的话,会有性能问题的,因为不是每次resize都会改变图表外层容器的宽高,因此需要一个可以精细化监听具体容器的resize,而这个resize observer就是做这个的。

不兼容IE: 20220428002528

并且ResizeObserver不需要防抖处理,理由如下:

20220428003640

写一个监听器,然后如果外层容器的宽高变化是,去修改charts的配置,然后再进行resize。如下:

var mainEle = document.getElementById('main');
var ro = new ResizeObserver(entries => {
    for (let entry of entries) {
        const cr = entry.contentRect;
        // 当图表外部容器的size变化是调用resize方法
        // ResizeObserver已经默认增加防抖处理
        myChart.resize();
    }
});

// 观察一个或多个元素
ro.observe(mainEle);

饼状图的合计以及自定义legend实现

继续补充中...