ECharts 使用经验几则

作者:vkvi 来源:ITPOW(原创) 日期:2022-3-30

如何给图表中的图形手动指定颜色?

给序列指定颜色

给序列指定颜色的方法是给图例指定颜色,具体方法是给 option.color 节点指定颜色代码的数组,数量与 option.legend.data 节点的图例名称的数量一致。如下图所示:

给序列指定颜色

 只给 option.color 节点指定颜色代码的数组也是可以的,将按照 option.color 节点颜色数组的顺序给序列赋予颜色。

给单个数据点指定颜色

具体的方法是给序列下级的数据节点指定颜色(option.series[i].data.itemStyle.color,series[i] 表示某个序列),如下图所示:

给单个点指定颜色

 序列中的数据值的数组中的对象可以是数值,也可是 json 对象,可以设置 json 对象中 itemStyle.color 的值来设置这个数据点的颜色。通过这种方式设置颜色的优先级比 option.color 设置的优先级高。当序列的类型为折线图时(即 type为‘line’),这样设置的颜色自能影响到线上面的点,而不会影响到线的颜色。如下图:

 最后要说的是,option.color 颜色的值其实不是专用于序列颜色设置的,他只是提供了一个备选颜色数组,序列会按照这个数组来设置颜色。其实在其他地方也会用到,比如当序列的类型为饼图(即 type 为 'pie')时,这个序列中未通过 itemStyle.color 设置颜色的数据点则会使用 option.color 数组中提供的颜色。比如下面这种情况:

 

EChart 线条颜色

 序列前两个数据点通过 itemStyle 设置颜色所以未使用 option.color 中的颜色,而未通过 itemStyle 设置颜色的数据点则使用循环使用 option.color 数组中的颜色来显示。

为什么重新绑定数据后,图不重新渲染呢?

获取 chart 对象后,调用对象的 setOption 方法即可重新渲染图,例如chart.setOption(option) 或 chart.setOption(option,true)。setOption 的第二个参数为 true,则表示不保留原来的数据数据,直接覆盖。我们通常中一般只是更新局部数据,所以我们一般可能会用第一种方法来,但是实际上用的时候就会发现问题。举例如下:

重新渲染

初始化时有 3 个序列的数据。

 

重新渲染

局部更新数据的数据有 2 个序列的数据。使用 chart.setOption(option),本以为是后面的这个序列数组替换掉了以前那个序列的数组。而实际上并不是如此,而是将以前的数组与后来的数组进行合并后,再将这个新数组用于更新。

如 [1,2,3] 和 [4,5] 实际上用于更新的数为 [4,5,3]。

如 [1,2,3] 和 [] 实际上用于更新的数组为 [1,2,3]。

所以使用 chart.setOption(option) 更新数据时,有时会出现感觉数据未刷新的情况。

可以考虑通过获取原来的 option 的值后,更新这个节点的值后,通过 chart.setOption(otion,true) 的方法来更新。如下:

重新渲染

数据种类较多时,如何避免堆叠显示,使显示更加清晰?

数据种类比较多,或者时数据间值的范围差异比较大,数据的单位不同的情况,容易造成图形堆叠、挤在一起,使图形显示不清楚。可以考虑使用不同的y轴,将数据在显示上分割开,从而避免这种情况的发生。具体方法如下:

在节点 option.yAxis 中定义多组 y 轴。比如此处就定义了两套 y 轴。

 

双 y 轴

在 option.series 节点中,通过数据的 yAxisIndex 属性指定采用哪种 y 轴,未明确指定的话,则默认使用数组中第一个。

双 Y 轴

图例布局解决思路

自带图例有可能在排版并不能完全满足需求,比如图例的大小、图例的排版(如横向排几个图例)。可以通过使用将图例隐藏起来,然后通过编写 Html 代码的方式来实现。图例是否显示通过 option. Legend.show 节点的值来控制(false表示不显示)。

相关文章