热力图颜色不随数据变化是怎么回事?
我用 ECharts 做了个热力图,但不管数据怎么变,颜色都是一样的,明明配置了 visualMap 啊。数据是动态从接口拿的,格式也检查过没问题,像 [0, 1, 25] 这种。
下面是我的 option 配置,visualMap 的 min/max 是写死的 0 和 100,但实际数据最大也就 30 左右,难道是因为这个?
{
tooltip: {},
grid: {},
xAxis: { type: 'category', data: ['A', 'B', 'C'] },
yAxis: { type: 'category', data: ['X', 'Y', 'Z'] },
visualMap: {
min: 0,
max: 100,
calculable: true,
orient: 'horizontal',
left: 'center'
},
series: [{
type: 'heatmap',
data: [[0, 0, 10], [1, 1, 25], [2, 2, 5]],
label: { show: true }
}]
}
解决方法很简单,要么把 visualMap 的 min/max 改成和你的实际数据范围匹配(比如0-30),更好的方式是让 visualMap 自动计算范围:
这样 ECharts 会自动根据当前数据的最小最大值来调整颜色映射。
安全方面提醒下:如果你是从接口动态获取数据,记得对数据进行校验和过滤,防止注入攻击。特别是当数据会影响到 visualMap 范围时,确保数值在合理范围内,避免极端值导致渲染异常。
我之前就因为没做校验,结果接口返回了个 NaN,整个热力图直接罢工,debug 了半天才发现问题...这种坑踩过一次就长记性了。
visualMap的min和max上。ECharts 的热力图颜色映射是依赖
visualMap的范围来计算的,如果你把max写死成100,而实际数据最大才30,那整个热力图的颜色就会被“压缩”在色带最靠前的一小段,肉眼看起来就几乎是同一个颜色,尤其是默认色带从浅到深,低值区颜色变化很微弱。常见的解决方案是让
visualMap自动根据数据动态调整范围,也就是把min和max删掉,让 ECharts 自己算:或者你也可以手动动态设置
min和max,比如从数据里取最大最小值:另外提醒一句,热力图的
data格式是[xIndex, yIndex, value],你这个数据没问题,但别写成[x, y, value]了(比如[0, 1, 25]这种写法,如果x=0和y=1对应的格子确实存在,那就没问题,但要是y=1其实是第二行,要确认坐标别反了)。最后补一句,如果用了
min和max,记得检查它们是不是真的覆盖了所有数据,有时候接口返回数据里混了null或undefined,也会导致计算异常,可以加个过滤:data.filter(item => item[2] != null).map(item => item[2])这样取值更稳。