使用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()
额外说明
- 补充了原代码遗漏的
numpy导入,否则meshgrid会报错。 - 如果觉得用投影坐标设置
set_extent不够直观,可以改用经纬度范围并指定crs=ccrs.PlateCarree(),更贴合你截取的55°N至90°N数据范围。
内容的提问来源于stack exchange,提问作者TheRhino
相关产品推荐
相关产品推荐

