暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python气象数据处理与绘图:极地投影绘图

气海无涯 2021-09-04
1903

当我们研究高纬(极地)区域时,往往需要极地投影。在前文中通过EOF介绍了圆柱投影,实际上极地投影的绘制仅需改变其中几个参数便可以实现。

还是先上图:


图1 极地投影填色图

填色图的意义并不重要(我之前研究求过的两个时间序列与海冰密集度的相关系数分布),接下来分享一下绘图的经验和代码。

proj =ccrs.NorthPolarStereo(central_longitude=90)
#在圆柱投影中proj = ccrs.PlateCarree(central_longitude=xx)
leftlon, rightlon, lowerlat, upperlat = (-180,180,60,90)
#仅画60°E-90°E部分
img_extent = [leftlon, rightlon, lowerlat, upperlat]
fig1 = plt.figure(figsize=(12,8))
#以下我仅展示了左半部分,右半部分基本一致,在此省略
f1_ax1 = fig3.add_axes([0.1, 0.1, 0.5, 0.5],projection = ccrs.NorthPolarStereo())
#注意此处添加了projection = ccrs.NorthPolarStereo(),指明该axes为北半球极地投影
f1_ax1.gridlines()
f1_ax1.set_extent(img_extent, ccrs.PlateCarree())

#通过圆柱投影的范围限制地图范围,这样设置地图参数较为方便

f1_ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))
#######以下为网格线的参数######
theta = np.linspace(0, 2*np.pi, 100)
center, radius = [0.5, 0.5], 0.5
verts = np.vstack([np.sin(theta), np.cos(theta)]).T
circle = mpath.Path(verts * radius + center)
##############################
f3_ax1.set_boundary(circle, transform=f3_ax1.transAxes)
#设置axes边界,为圆形边界,否则为正方形的极地投影
#c7 = f3_ax1.contourf(lon,lat,r, zorder=0, levels =np.arange(-0.6,0.7,0.1) , extend = 'both',transform=ccrs.PlateCarree(), cmap=plt.cm.RdBu_r)

#绘制填色,需要说明的是:虽然是极地投影,但是我们的数据仍是按圆柱投影计算的,所以数据的坐标转换仍为

transform=ccrs.PlateCarree()

以上便完成了基本图形的绘制,但是效果是这样的(在此并未添加填色):


图2 极地投影


然而发现没有坐标信息,很绝望,我查了很多资料,发现用basemap库绘图解决这个问题是比较容易的,然而并没有发现cartopy是如何解决这个问题的(如果有大佬知道也可以留言一下相关链接),
所以我给了一个很蠢的办法,自己强行加...加!就硬加!

fig1.text(x,y,r'0$^\circ$',fontsize=14, horizontalalignment='center',verticalalignment='center')

调整文字坐标x,y最终便能达到图1的效果

最后加上色标完成。

position=fig1.add_axes([0.38, 0.04, 0.35, 0.025])
fig1.colorbar(c7,cax=position,orientation='horizontal',format='%.1f',)


另外推荐一种新的添加坐标方法:

可以参考这个网址:

https://stackoverflow.com/questions/61778059/how-to-add-more-lines-of-longitude-latitude-in-northpolarstereo-projection

最后得到这个效果:


文章转载自气海无涯,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论