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

