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

Matplotlib LinearSegmentedColormap未正确匹配零点颜色问题

解决Matplotlib自定义色阶中点非纯白问题

问题重现

自定义的OrWhBu色阶包含17个颜色节点,其中第9个节点为纯白(255,255,255),预期在色阶中点0.5处返回纯白(1.0,1.0,1.0,1.0),但实际调用OrWhBu(0.5)返回的是偏黄的近似纯白值,导致填充等高线的中央分箱与纯白背景有明显视觉差异。

色阶定义代码:

from matplotlib.colors import LinearSegmentedColormap
import numpy as np

OrWhBu = LinearSegmentedColormap.from_list('OrWhBu', np.array((
    (118,  21,  33),
    (145,  28,  19),
    (200,  42,  29),
    (225,  92,  51),
    (233, 137,  51),
    (247, 221, 118),
    (251, 241, 169),
    (255, 255, 205),
    (255, 255, 255),  # 预期对应0.5的纯白节点
    (239, 253, 255),
    (220, 254, 253),
    (140, 213, 235),
    (102, 177, 207),
    ( 76, 143, 165),
    ( 67,  80, 127),
    ( 33,  45, 108),
    ( 23,  45,  81)))/255
)

问题原因

LinearSegmentedColormap.from_list默认将17个节点均匀映射到0~1范围,间隔为1/(17-1)=0.0625,纯白节点理论对应位置应为8*0.0625=0.5。但浮点数精度误差或内部插值逻辑可能导致查询0.5时触发相邻节点的插值计算,而非直接返回纯白节点颜色。

解决方案

手动指定每个颜色节点的位置,确保纯白节点精确对应0.5,避免插值干扰:

from matplotlib.colors import LinearSegmentedColormap
import numpy as np

# 保持原颜色顺序的数组
colors = np.array((
    (118,  21,  33),
    (145,  28,  19),
    (200,  42,  29),
    (225,  92,  51),
    (233, 137,  51),
    (247, 221, 118),
    (251, 241, 169),
    (255, 255, 205),
    (255, 255, 255),  # 纯白节点(第9个,索引8)
    (239, 253, 255),
    (220, 254, 253),
    (140, 213, 235),
    (102, 177, 207),
    ( 76, 143, 165),
    ( 67,  80, 127),
    ( 33,  45, 108),
    ( 23,  45,  81)))/255

# 构造位置数组:前9个颜色从0到0.5均匀分布,后8个从0.5到1均匀分布
positions = np.concatenate([
    np.linspace(0, 0.5, 9),  # 纯白节点精确对应0.5
    np.linspace(0.5, 1, 8)[1:]  # 跳过重复的0.5位置,避免节点冲突
])

# 创建色阶时绑定位置与颜色
OrWhBu = LinearSegmentedColormap.from_list('OrWhBu', list(zip(positions, colors)))

验证

执行以下代码确认中点颜色:

print(OrWhBu(0.5))  # 输出 (1.0, 1.0, 1.0, 1.0)

此时绘制填充等高线,中央分箱颜色将与纯白背景完全一致,消除视觉差异。

内容的提问来源于stack exchange,提问作者Notso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:14:52