Matplotlib 2D绘图无数据区域着色异常set_under不生效如何解决
问题原因
- 你在创建
pcolormesh时指定的vmin=0.0被后续的mesh.set_clim(minimum,maximum)覆盖,set_under的触发阈值被修改为实际数据的最小值,导致无数据区域无法触发对应颜色设置 - 你为色条设置了对数尺度,对数标度下小于等于0的数值会被默认识别为无效值,不会触发
set_under规则 - 直接修改全局
cm.jet实例可能引发色图污染,也可能在部分环境下出现设置不生效的问题
最优解决方案
优先采用无效值标记+set_bad的方案适配对数色标场景,操作步骤如下:
- 预处理数据,统一标记无数据区域为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
- 修正色图与颜色范围设置,删除后续重复修改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) 这行代码,避免覆盖之前的设置
- 如果你坚持使用
set_under方案,需要保证无数据区域的数值为小于vmin的正数,且全程不修改clim:
- 将无数据区域的值设置为
vmin * 0.1(小于vmin的正数) - 保留
cmap.set_under(bad_color) - 删除后续的
mesh.set_clim调用
内容的提问来源于stack exchange,提问作者pythonbeginner90
相关产品推荐
相关产品推荐

