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

如何将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:柔性屏障(多边形掩码)

如果蓝线是不规则曲线,区域形状无法用简单经纬度区间框定,就需要用自定义多边形来生成掩码,步骤如下:

  1. 获取蓝线右侧区域的多边形顶点坐标:可以通过Matplotlib交互拾取、GIS工具导出或手动从图中读取关键坐标点,格式为[(lon1, lat1), (lon2, lat2), ..., (lonN, latN)]。
  2. 用多边形路径判断每个网格点是否属于目标区域,生成掩码后设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:46:28