如何去除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
相关产品推荐
相关产品推荐

