Matplotlib自定义颜色条颜色显示异常问题求助
问题描述
我想要的颜色条是图A的样式,但实际绘图时,颜色条显示的是图A的样子,可地图上的颜色却对应图B的颜色条。以下是我的代码:
cmap = (mpl.colors.ListedColormap(['#d2fffe', '#88fefd', '#00c6ff', '#1996ff', '#3c41ff', '#3cbc3d', '#a5d71f', '#ffe600', '#ffc300', '#ff7d00', '#ff0000', '#c80000', '#d464c3', '#b5199d', '#840094', '#dcdcdc', '#b4b4b4', '#8c8c8c', '#5a5a5a']).with_extremes(over='black', under='white')) bounds = [0.2,1,3,5,7,10,15,20,25,30,40,50,60,70,80,100,125,150,175,200] norm = mpl.colors.BoundaryNorm(bounds, cmap.N) fig = plt.figure(figsize=(16, 12), dpi=120) ax = fig.add_subplot(projection=cart_proj) ax.contourf(lons, lats, my_var, levels=19, cmap=cmap, zorder=3, transform=crs.PlateCarree(), alpha=0.85) cbar = fig.colorbar(mpl.cm.ScalarMappable(cmap=cmap, norm=norm), extend='both', extendfrac='auto', ticks=bounds, spacing='uniform')
问题分析
核心问题是绘图和色条用了两套不同的归一化规则:
contourf仅指定levels=19,未传入自定义norm,matplotlib会默认使用线性归一化,将数据映射到19个等间距区间,对应图B的颜色逻辑;colorbar使用了自定义的BoundaryNorm,按照bounds的非等间距区间映射颜色,对应图A的样式。两者规则不匹配,就出现了“色条显示正确,但绘图颜色不对”的矛盾。
解决方法
把自定义的norm传给contourf,同时将levels参数替换为你定义的bounds(bounds包含20个值,刚好划分出19个区间,与cmap的19种颜色一一对应):
修正后的代码:
cmap = (mpl.colors.ListedColormap(['#d2fffe', '#88fefd', '#00c6ff', '#1996ff', '#3c41ff', '#3cbc3d', '#a5d71f', '#ffe600', '#ffc300', '#ff7d00', '#ff0000', '#c80000', '#d464c3', '#b5199d', '#840094', '#dcdcdc', '#b4b4b4', '#8c8c8c', '#5a5a5a']).with_extremes(over='black', under='white')) bounds = [0.2,1,3,5,7,10,15,20,25,30,40,50,60,70,80,100,125,150,175,200] norm = mpl.colors.BoundaryNorm(bounds, cmap.N) fig = plt.figure(figsize=(16, 12), dpi=120) ax = fig.add_subplot(projection=cart_proj) # 关键修改:传入norm,levels替换为bounds ax.contourf(lons, lats, my_var, levels=bounds, cmap=cmap, norm=norm, zorder=3, transform=crs.PlateCarree(), alpha=0.85) cbar = fig.colorbar(mpl.cm.ScalarMappable(cmap=cmap, norm=norm), extend='both', extendfrac='auto', ticks=bounds, spacing='uniform')
补充说明
- 传入
norm后,contourf会严格按照bounds的区间划分数据并映射颜色,与色条的逻辑完全统一; BoundaryNorm的区间数量由bounds的长度决定,20个边界值对应19个颜色区间,刚好匹配你定义的19种颜色的cmap。
内容的提问来源于stack exchange,提问作者AlFa
相关产品推荐
相关产品推荐

