如何在Python的Cartopy中使用给定PROJ4字符串绘制海冰浓度数据?
北极立体投影海冰数据绘图解决方案
一、确定正确的CRS与投影逻辑
你的数据采用自定义北极立体投影,参数完全由提供的PROJ4字符串定义,不能直接使用cartopy自带的NorthPolarStereo或默认Stereographic——这些内置类的参数(如中央经度、椭球参数)和你的PROJ4不匹配,会导致坐标错位。
正确的处理方式:
- 直接用给定的PROJ4字符串创建专属CRS对象,这就是你的数据所在的坐标参考系统。
- 绘图轴的投影可以直接使用这个自定义CRS(因为它本身就是北极立体投影,符合你的可视化需求)。
- 绘制数据时,
transform参数必须指定为这个数据CRS,让cartopy明确数据的坐标规则。
二、修正后的可运行代码
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature # 替换为你的实际数据变量 # x_coords, y_coords, values = ... # 从PROJ4字符串创建数据对应的CRS proj4_str = "+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.449 +units=m +no_defs" data_crs = ccrs.Projection(proj4_str) fig = plt.figure(figsize=(10, 10)) # 绘图轴使用自定义的北极立体投影 ax = fig.add_subplot(1, 1, 1, projection=data_crs) # 添加地理底图要素 ax.add_feature(cfeature.COASTLINE, linewidth=0.8) ax.add_feature(cfeature.LAND, color="black", alpha=0.5) ax.add_feature(cfeature.OCEAN, color="white", alpha=0.3) # 绘制海冰浓度散点图,transform必须匹配数据CRS scatter = plt.scatter(x_coords, y_coords, c=values, cmap='jet', s=10, transform=data_crs) # 添加色标并设置标签 cbar = plt.colorbar(scatter, shrink=0.8) cbar.set_label('海冰浓度') # 添加经纬度网格线 ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=0.1, color='gray', alpha=0.5, linestyle='--') # 可选:设置地图显示范围(根据你的数据纬度范围调整) # ax.set_extent([-180, 180, 60, 90], crs=ccrs.PlateCarree()) plt.show()
三、原代码的核心错误
- 轴投影使用了
crs.NorthPolarStereo(central_longitude=0),和你的PROJ4中lon_0=-45的参数冲突,导致地图偏移。 transform参数误用了默认Stereographic,其参数(如中央纬度、椭球)和数据的PROJ4完全不符,cartopy无法正确解析你的x/y坐标。
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

