如何将Cartopy地图指定区域标记为NaN值?
解决方案:将指定区域数值设为NaN
方法1:基于经纬度范围的简单掩码
如果蓝线右侧区域可以用固定经纬度区间大致框定,直接通过布尔索引设置NaN是最快捷的方式。
假设蓝线对应的经度阈值为lon_threshold(根据你的地图实际取值调整),操作代码如下:
import numpy as np # 复制5月的数据(避免修改原数组) may_data = new[4, :, :].copy() # 生成掩码:筛选出经度大于阈值的区域 mask = lon > lon_threshold # lon为你的1D/2D经度数组,需与数据维度匹配 # 将目标区域设为NaN may_data[mask] = np.nan # 替换原绘图代码中的数据,执行绘图 plt.contourf(lon, lat, may_data, transform=ccrs.PlateCarree(), cmap=cmocean.cm.thermal, zorder=4 )
方法2:柔性屏障(多边形掩码)
如果蓝线是不规则曲线,区域形状无法用简单经纬度区间框定,就需要用自定义多边形来生成掩码,步骤如下:
- 获取蓝线右侧区域的多边形顶点坐标:可以通过Matplotlib交互拾取、GIS工具导出或手动从图中读取关键坐标点,格式为
[(lon1, lat1), (lon2, lat2), ..., (lonN, latN)]。 - 用多边形路径判断每个网格点是否属于目标区域,生成掩码后设置NaN。
代码示例:
import numpy as np from matplotlib.path import Path # 1. 替换为你实际的多边形顶点坐标(示例仅作参考) poly_coords = [ (115, 28), (130, 36), (142, 33), (138, 24), (120, 26) ] # 2. 生成与数据匹配的经纬度网格矩阵 lon_grid, lat_grid = np.meshgrid(lon, lat) # 将网格点转为一维坐标对 points = np.column_stack((lon_grid.flatten(), lat_grid.flatten())) # 3. 创建多边形路径,判断每个点是否在目标区域内 path = Path(poly_coords) mask = path.contains_points(points).reshape(lon_grid.shape) # 4. 将目标区域数值设为NaN may_data = new[4, :, :].copy() may_data[mask] = np.nan # 5. 执行绘图(与你的原代码一致,仅替换数据) fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(111, projection=rot) plot_cartopy(ax, lon, lat) plt.title("Month = May") plt.contourf(lon, lat, may_data, transform=ccrs.PlateCarree(), cmap=cmocean.cm.thermal, zorder=4 ) plt.clim(0,100) plt.colorbar() plt.show()
额外提示
- 若需批量处理所有月份,可通过循环遍历
new的第一个维度(月份维度)重复上述掩码操作。 - 交互拾取坐标可使用
plt.ginput(n)(n为拾取点数量),运行后点击地图即可获取坐标。
内容的提问来源于stack exchange,提问作者NorthWind4721
相关产品推荐
相关产品推荐

