You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

二维热图效果(刻度正常)

Plotly二维离散色阶热图


修改后代码(一维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()

一维热图效果(刻度偏移)

Plotly一维离散色阶热图(刻度偏移)


解决方案:显式指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:43:29