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

使用Matplotlib和Cartopy绘制北极立体投影时NetCDF SST数据不显示

北极立体投影下SST数据无法显示的问题解决

问题根源

你的代码核心错误在于pcolormesh的transform参数设置错误:

  • 你的SST原始数据是基于**经纬度(PlateCarree)**的,但你把transform指定为北极立体投影(crs_epsg),这会让Cartopy错误地将经纬度数值当作北极立体投影的平面坐标来解析,导致数据无法匹配地图范围,自然显示不出来。
  • 记住:projection是绘图时使用的目标坐标系,而transform是告诉Cartopy你的原始数据采用的坐标系,二者必须对应。

修改后的代码

# Necessary packages:
import cartopy.crs as ccrs           # for projection
import cartopy.feature as cfeature   # for projection
import matplotlib.pyplot as plt      # for plotting
import numpy as np  # 原代码漏导入numpy,meshgrid依赖它
import warnings
warnings.filterwarnings("ignore")

# Extract latitude, Longitude and SST data:
lat = ds_subset['lat'].values
lon = ds_subset['lon'].values
sst_data = ds_subset['SST'].values


# Create meshgrid for latitude and longitude:
lon_grid, lat_grid = np.meshgrid(lon, lat)


# Set mapping crs to Cartopy's north polar stereographic:
crs_epsg = ccrs.NorthPolarStereo(central_longitude = -15)
#crs_epsg = ccrs.PlateCarree()

# Set Figure Size:
fig = plt.figure(figsize = [10, 10])

# Set the map projection and associated boundaries:
ax = plt.axes(projection = crs_epsg)
# 也可以用经纬度范围设置extent(更直观贴合你的数据子集):
# ax.set_extent([-180, 180, 55, 90], crs=ccrs.PlateCarree())
ax.set_extent([-3850000.0, 3750000.0, -5350000, 5850000.0], crs=crs_epsg)
ax.coastlines()
ax.add_feature(cfeature.LAND)


# 关键修改:transform指定为数据的原始坐标系PlateCarree
cs = ax.pcolormesh(lon_grid, lat_grid, sst_data[5,:,:],
                  cmap=plt.cm.jet, transform=ccrs.PlateCarree(), 
                  vmin=np.min(sst_data), vmax=np.max(sst_data), shading='auto')
fig.colorbar(cs, ax=ax, location='bottom', shrink =0.8)
ax.set_title('SST')

plt.show()

额外说明

  1. 补充了原代码遗漏的numpy导入,否则meshgrid会报错。
  2. 如果觉得用投影坐标设置set_extent不够直观,可以改用经纬度范围并指定crs=ccrs.PlateCarree(),更贴合你截取的55°N至90°N数据范围。

内容的提问来源于stack exchange,提问作者TheRhino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:03:23