matplotlib contourf设置色条0值为白色报DivergingNorm错误
问题修复方案
你遇到的报错、警告和需求可以按以下方式逐一解决:
1. 修复DivergingNorm未定义报错
Matplotlib 3.2及以上版本已经移除了DivergingNorm类,该类被重命名为TwoSlopeNorm,功能完全一致。你需要做两处修改:
- 将导入语句替换为
from matplotlib.colors import TwoSlopeNorm - 将归一化实例化代码替换为
norm = TwoSlopeNorm(vmin=val.min(), vcenter=0, vmax=val.max())
这个归一化方法会自动将你指定的中心值(这里是0)映射到色条的中点位置,是实现发散色条中心对齐指定值的标准方案。
2. 修复tri参数未被识别的警告
Basemap的contourf方法仅支持规则网格数据输入,本身没有tri参数,这个参数是三角网格专用填色接口的参数。你当前输入的是离散散点坐标,不属于规则经纬网格,应该直接调用三角网格填色方法m.tricontourf,不需要额外传入tri=True参数,该方法原生支持非结构散点的三角剖分插值绘图,同时完全兼容norm参数传入。
3. 确保0值位置对应白色
你使用的RdBu_r是发散型色卡,中点本身就是纯白色,配合TwoSlopeNorm将0值对齐到色卡中点后,默认就会实现0值为白色的效果。如果需要更严格的颜色控制,可以手动对色卡做显式设置:
from matplotlib import cm # 复制原有色卡避免修改全局默认配置 cmap = cm.get_cmap('RdBu_r').copy() # 可按需设置超出范围值、缺省值的颜色 cmap.set_under(cmap(0)) cmap.set_over(cmap(1)) cmap.set_bad('white')
绘图时将自定义后的cmap传入接口即可。
修正后可直接运行的完整代码
import numpy as np from matplotlib import pyplot as plt from mpl_toolkits import basemap from matplotlib.colors import TwoSlopeNorm lat=np.array([18,20,23, 50]) lon=np.array([-10, 40, 50, -60]) val=np.array([-3, 8, -10, -50]) m = basemap.Basemap(projection='robin', lon_0=0, lat_0=0, resolution='l',area_thresh=1000) m.drawcoastlines(color = 'black') x,y = m(lon,lat) norm = TwoSlopeNorm(vmin=val.min(), vcenter=0, vmax=val.max()) # 换用tricontourf,移除无效tri参数 colormesh= m.tricontourf(x,y,val,32, norm=norm, cmap='RdBu_r') # 显式传入填色对象给colorbar,避免多图时匹配错误 plt.colorbar(colormesh, location='bottom',pad=0.04,fraction=0.06) plt.show()
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

