Plotly单行列热图颜色条刻度位置异常问题
问题:Plotly单行列热图离散色阶刻度偏移
基于离散色阶热图实现的代码中,当z为二维数组时,颜色条刻度显示完全正常;但将z改为一维数组(仅保留第一行数据)后,颜色条的刻度位置出现明显上移偏移。
原正常代码(二维z)
import numpy as np import plotly.graph_objects as go def discrete_colorscale(bvals, colors): """ bvals - 划分区间的边界值列表 colors - 对应区间的RGB或十六进制颜色码列表,对应[bvals[k], bvals[k+1]]区间 返回Plotly格式的离散色阶 """ if len(bvals) != len(colors) + 1: raise ValueError('边界值列表长度应等于颜色列表长度+1') bvals = sorted(bvals) # 归一化边界值 nvals = [(v - bvals[0]) / (bvals[-1] - bvals[0]) for v in bvals] dcolorscale = [] # 离散色阶 for k in range(len(colors)): dcolorscale.extend([(nvals[k], colors[k]), (nvals[k + 1], colors[k])]) return dcolorscale bvals = [2, 15, 40, 65, 90] colors = ['#09ffff', '#19d3f3', '#e763fa' , '#ab63fa'] dcolorsc = discrete_colorscale(bvals, colors) bvals = np.array(bvals) # 计算刻度值(对应区间中点) tickvals = [np.mean(bvals[k:k + 2]) for k in range(len(bvals) - 1)] # 生成刻度文本 ticktext = [f'<{bvals[1]}'] + [f'{bvals[k]}-{bvals[k+1]}' for k in range(1, len(bvals)-2)]+[f'>{bvals[-2]}'] z = np.random.randint(bvals[0], bvals[-1]+1, size=(20, 20)) heatmap = go.Heatmap( z=z, colorscale=dcolorsc, colorbar=dict(thickness=25, tickvals=tickvals, ticktext=ticktext) ) fig = go.Figure(data=[heatmap]) fig.update_layout(width=500, height=500) fig.show()
二维热图效果(刻度正常)

修改后代码(一维z)
仅将z改为单一行数据:
# ... 其余代码与上述一致 ... heatmap = go.Heatmap( z=[z[0]], colorscale=dcolorsc, colorbar=dict(thickness=25, tickvals=tickvals, ticktext=ticktext) ) fig = go.Figure(data=[heatmap]) fig.update_layout(width=500, height=500) fig.show()
一维热图效果(刻度偏移)

解决方案:显式指定zmin和zmax
偏移原因是:当z为一维数组时,Plotly会自动计算数据的极值作为色阶范围,若数据未覆盖所有定义的区间边界,会导致色阶归一化范围与预设的离散区间不匹配,进而引发刻度偏移。
只需在Heatmap参数中显式指定色阶的最小/最大值为预设的边界值即可:
heatmap = go.Heatmap( z=[z[0]], colorscale=dcolorsc, zmin=bvals[0], # 固定色阶最小值 zmax=bvals[-1], # 固定色阶最大值 colorbar=dict(thickness=25, tickvals=tickvals, ticktext=ticktext) )
修改后,无论z是二维还是一维数组,颜色条刻度都会保持正确位置,因为色阶范围被固定为预设的边界区间,不再随z的实际数据范围变化。
内容的提问来源于stack exchange,提问作者Jon Nir
相关产品推荐
相关产品推荐

