当我们研究高纬(极地)区域时,往往需要极地投影。在前文中通过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',)
网友评论