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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:10:37