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

Matplotlib 2D绘图无数据区域着色异常set_under不生效如何解决

问题原因
  • 你在创建pcolormesh时指定的vmin=0.0被后续的mesh.set_clim(minimum,maximum)覆盖,set_under的触发阈值被修改为实际数据的最小值,导致无数据区域无法触发对应颜色设置
  • 你为色条设置了对数尺度,对数标度下小于等于0的数值会被默认识别为无效值,不会触发set_under规则
  • 直接修改全局cm.jet实例可能引发色图污染,也可能在部分环境下出现设置不生效的问题
最优解决方案

优先采用无效值标记+set_bad的方案适配对数色标场景,操作步骤如下:

  1. 预处理数据,统一标记无数据区域为NaN
# 方式1:按数值阈值标记
threshold = 你定义的无数据数值阈值
inp_conc[inp_conc < threshold] = np.nan
# 方式2:按y轴坐标标记1.2km以下所有区域为无数据
y_12km_temp = 1.2km对应的温度阈值
inp_conc[temperatures < y_12km_temp, :] = np.nan
  1. 修正色图与颜色范围设置,删除后续重复修改clim的代码
bad_color = 'lightgray'
# 复制色图实例修改,避免污染全局色图
cmap = plt.cm.jet.copy()
# 用set_bad设置NaN/掩码值的填充色,适配对数标度
cmap.set_bad(color=bad_color)

# 计算对数适用的颜色范围,避免vmin为0
vmin = np.nanpercentile(inp_conc, 1) # 可替换为你需要的下限值,保证大于0
vmax = np.nanmax(inp_conc)

mesh = display.fig.axes[0].pcolormesh(xrng,temperatures,inp_conc.transpose(),cmap=cmap,
    vmin=vmin, vmax=vmax)

# 后续创建色条时删除 mesh.set_clim(minimum,maximum) 这行代码,避免覆盖之前的设置
  1. 如果你坚持使用set_under方案,需要保证无数据区域的数值为小于vmin的正数,且全程不修改clim:
  • 将无数据区域的值设置为vmin * 0.1(小于vmin的正数)
  • 保留cmap.set_under(bad_color)
  • 删除后续的mesh.set_clim调用

内容的提问来源于stack exchange,提问作者pythonbeginner90

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:18:01