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
相关产品推荐
相关产品推荐

