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

如何去除xarray绘图中无效值(bad value)的边缘颜色

如何去除xarray绘图中无效值(bad value)的边缘颜色

我完全理解你的需求啦——你已经用set_bad把NaN像素设为红色,但现在只希望蓝色、灰色的有效数据像素显示边缘颜色,而红色的无效像素不要有边缘,对吧?

你当前的代码里,因为给整个绘图统一设置了edgecolor="grey",导致所有像素(包括无效的红色像素)都带上了灰色边缘,就像这张图里这样:
当前的绘图效果

我们可以通过针对性控制每个像素块的边缘颜色来解决这个问题,下面是修改后的完整代码:

import matplotlib.pyplot as plt
import xarray as xr
import numpy as np
from matplotlib import colors

fig, ax = plt.subplots(1, 1, figsize=(12, 8))
# 生成示例数据数组
data = xr.DataArray([np.random.rand(10, 10)])

# 设置指定位置为NaN(无效值)
nan_positions = [
    (0,1,1), (0,1,2), (0,1,3),
    (0,2,1), (0,2,2), (0,2,3),
    (0,3,1), (0,3,2), (0,3,3)
]
for pos in nan_positions:
    data[pos] = np.nan

# 定义有效数据的颜色映射(蓝色、灰色)
cmap = colors.ListedColormap(['#2c7bb6', "#999999"])
# 将NaN标记为无效值,颜色设为红色
cmap.set_bad(color='red')

# 先绘制数据,暂不设置全局边缘色
mesh = data.plot(cmap=cmap, ax=ax, edgecolor='none')

# 生成边缘颜色列表:有效数据用灰色,无效数据(NaN)无边缘
flat_data = data[0].values.flatten()
edge_colors = ['grey' if not np.isnan(val) else 'none' for val in flat_data]

# 逐个像素块设置对应的边缘颜色
for patch, ec in zip(mesh.collections[0].get_paths(), edge_colors):
    patch.set_edgecolor(ec)

plt.show()

关键修改说明:

  • 绘图时不再用全局的edgecolor="grey",而是先设为'none',避免给所有像素默认添加边缘;
  • 根据数据是否为NaN生成对应的边缘颜色规则:有效数据保留灰色边缘,NaN对应的像素块直接去掉边缘(设为'none');
  • 遍历每个像素块(patch),给它们单独设置边缘颜色,实现精准控制。

这样修改后,你就能得到想要的效果:只有蓝色和灰色的有效像素显示灰色边缘,红色的无效像素不会有边缘啦~

备注:内容来源于stack exchange,提问作者Jane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:59:52