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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:42:23