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

修复Matplotlib中TwoSlopeNorm导致的色标区间颜色异常问题

修复matplotlib contourf中TwoSlopeNorm导致的区间颜色重复/白色问题

你遇到的问题是由于TwoSlopeNorm的颜色映射逻辑和设置的levels范围不匹配导致的:

  • TwoSlopeNorm会以vcenter=0为中点,将颜色映射范围分为两部分:负值区间(-5到0)对应colormap的左半段(蓝色到白色),正值区间(0到25)对应colormap的右半段(白色到红色)。
  • 你的正值范围(25)是负值范围(5)的5倍,导致正值区间在colormap的右半段被压缩,15-20、20-25区间对应的colormap位置过于接近,视觉上颜色重叠;而0-5、5-10区间靠近colormap的白色中点,所以显示为白色。

方式1:调整TwoSlopeNorm映射比例+更换渐变colormap

通过明确指定vmin、vcenter、vmax让TwoSlopeNorm按数据区间比例分配颜色,同时选择渐变更均匀的colormap替代bwr,避免白色区域过宽:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import TwoSlopeNorm

fig, axes = plt.subplots()
levels = np.linspace(-5, 25, 7)
# 明确绑定数据范围,确保颜色映射比例匹配区间长度
norm = TwoSlopeNorm(vmin=-5, vcenter=0, vmax=25)
# 使用coolwarm替代bwr,颜色过渡更平滑
im0 = da6_annualtmn.plot.contourf(
    norm=norm, 
    cmap='coolwarm', 
    extend='max', 
    levels=levels
)
plt.colorbar(im0)
plt.show()

方式2:用BoundaryNorm自定义区间颜色

如果需要精准控制每个区间的颜色,避免自动映射的不确定性,可以使用BoundaryNorm配合自定义颜色列表,确保每个levels区间对应唯一颜色:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import BoundaryNorm, ListedColormap

fig, axes = plt.subplots()
levels = np.linspace(-5, 25, 7)
# 自定义6种颜色,对应6个区间(从蓝到红渐变)
colors = ['#0033ff', '#6699ff', '#ffffff', '#ff9966', '#ff3333', '#cc0000']
# 绑定levels和颜色的对应关系
norm = BoundaryNorm(levels, ncolors=len(colors))
custom_cmap = ListedColormap(colors)

im0 = da6_annualtmn.plot.contourf(
    norm=norm, 
    cmap=custom_cmap, 
    extend='max', 
    levels=levels
)
plt.colorbar(im0)
plt.show()

说明:

  • 方式1适合保留渐变风格的场景,coolwarm的颜色过渡比bwr更均匀,不会出现大面积白色区域。
  • 方式2适合需要完全控制每个区间颜色的场景,可根据需求修改colors列表中的颜色值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:51:23