如何将两个xarray Dataset绘制到同一图中并实现掩蔽效果?
实现步骤与代码示例
以下是直接满足需求的完整代码方案,基于xarray与cartopy实现:
import xarray as xr import numpy as np import cartopy.crs as ccrs import matplotlib.pyplot as plt # 1. 模拟匹配的两个数据集(替换为你的实际数据) lon = np.linspace(0, 180, 30) lat = np.linspace(-90, 90, 30) # Dataset1:待显示的主数据 data1 = np.random.randn(len(lat), len(lon)) + 2 ds1 = xr.Dataset( {'var1': (['lat', 'lon'], data1)}, coords={'lat': lat, 'lon': lon} ) # Dataset2:用于生成掩蔽规则的数据集(值为0的区域需要掩蔽) data2 = np.random.randint(0, 2, size=(len(lat), len(lon))) ds2 = xr.Dataset( {'var2': (['lat', 'lon'], data2)}, coords={'lat': lat, 'lon': lon} ) # 2. 生成掩蔽掩码 mask = ds2['var2'] == 0 # 3. 绘图流程 fig, ax = plt.subplots( figsize=(10, 6), subplot_kw={'projection': ccrs.PlateCarree()} ) # 绘制Dataset1的主色图(保留coolwarm配色) ds1['var1'].plot( ax=ax, cmap='coolwarm', transform=ccrs.PlateCarree(), cbar_kwargs={'label': 'Dataset1 变量'} ) # 叠加掩蔽区域:绿色填充Dataset2值为0的区域 ax.contourf( ds1['lon'], ds1['lat'], mask, levels=[0.5, 1.5], # 精准选中布尔值为True的区域(True对应数值1) colors='green', transform=ccrs.PlateCarree(), alpha=0.5 # 可选:设置透明度,避免完全覆盖主数据 ) # 添加地图基础元素 ax.coastlines() ax.gridlines(draw_labels=True) plt.title('Dataset1 叠加 Dataset2 掩蔽区域(绿色)') plt.show()
核心细节说明:
- 掩码生成:通过
ds2['var2'] == 0生成布尔数组,True即为需要掩蔽的目标区域 - 掩蔽绘制:使用
contourf绘制掩码区域,levels=[0.5,1.5]的设置可以精准筛选出布尔值为True的区域(布尔数组在计算时True=1,False=0) - 透明度控制:
alpha=0.5让绿色掩蔽区半透明,若需要完全覆盖主数据可删除该参数 - 坐标兼容:由于两个数据集的经纬度维度完全一致,直接复用Dataset1的坐标即可完成绘图
内容的提问来源于stack exchange,提问作者alextc
相关产品推荐
相关产品推荐

