剖面图使用的资料是ERA5 hourly data on pressure levels from 1979 to present的再分析资料,降水量图则用的是ERA5 hourly data on single levels from 1979 to present,精度均为0.25° * 0.25°。无论用什么资料,在复现的过程中请大家务必务必注意精度到底是怎么样的,否则抄代码都抄歪了。
垂直剖面图
因为想一次性输出很多张垂直剖面图,于是用到了函数块来实现,在画剖面图时把通用的设置放在了CutawayRH()这个函数里,不同时次则在外面的循环中控制。其实函数迭代啥的都不是很难,不过时间和arange元素的对应上有时候绕不过来就会出大问题……
以我给图片标题和图片名称的迭代为例子吧:
lat = obj['latitude'][:]
lon = obj['longitude'][:]
level = obj['level'][:] #读取气压层数,一维的
hour = [0, 6, 12, 18]
以上代码时根据我所使用的再分析资料来写的,我的资料里是每隔6小时有一份数据,而且我将两天(即21日、22日)的资料都放在一起了,即一共有8个时次的信息,如果说我们直接用range(0,8)来带进去循环的话,也不是不可以,但是需要多判断几次,很容易被绕晕,所以我选择了先画前一天再画后一天的笨办法……
for time in range(0,4):
r = obj['r'][time][:][:][:] #读取相对湿度,三维的
u = obj['u'][time][:][:][:] #读取纬向风,三维的
v = obj['v'][time][:][:][:] #读取经向风,三维的
CutawayRH(lat, lon, level, r, u, v)
所以命名的时候直接套就完事了,画22日的时候还是要注意一下,hour[]里是没有(4:8)的元素的,记得减一下……
21日:
ax.set_title(f'2020年5月21日{hour[time]}时(世界时)相对湿度与风场剖面图',fontsize=10)
fig.savefig(f'E:\\Jupyter\\0521剖面图\\200521{hour[time]}剖面图',bbox_inches='tight')
22日:
ax.set_title(f'2020年5月22日{hour[time-4]}时(世界时)相对湿度与风场剖面图',fontsize=10)
fig.savefig(f'E:\\Jupyter\\0521剖面图\\200522{hour[time-4]}剖面图',bbox_inches='tight')
对于画剖面图的函数,其实也不算难,主要还是翻转坐标轴、坐标轴设置(经纬度标注)
def CutawayRH(lat, lon, level, r, u, v):
fig=plt.figure(figsize=(5,3),dpi=300)
ax=fig.add_axes([0,0,1,1])
##### RH
ax.invert_yaxis() #翻转坐标轴
ax.set_yticks([1000,900,850,700,500,200])
如果使用了坐标轴转换为经纬度显示的设置的话,就不需要自己手动输入那么麻烦了:
ax.set_xticklabels(np.arange(20,30,2))
ax.xaxis.set_major_formatter(LongitudeFormatter())
很麻烦的通过设置坐标轴标签来更改格式的方法:
ax.set_xticklabels([r'28$^\degree$N',r'29$^\degree$N',r'30$^\degree$N',r'31$^\degree$N',r'32$^\degree$N',
r'33$^\degree$N',r'34$^\degree$N',r'35$^\degree$N'])
此后是设置y轴的范围&各轴的标签,为了显示全风向范围稍微扩大了一点:
ax.set(ylim=(1050,150)) #设置气压层绘图范围
ax.set_xlabel('纬度',fontsize=10)
ax.set_ylabel('层次(hPa)',fontsize=10)
ax.tick_params(axis='both',which='both',labelsize=7)
ac=ax.contourf(lat[240:280],level[:],r[:,240:280,452],
cmap='Greens',levels=np.arange(60,105,5),extend='both',alpha=0.75)
ax.barbs(lat[240:280:4],level[:],u[:,240:280:4,452],v[:,240:280:4,452],
barb_increments={'half':2,'full':4,'flag':20},length=5,linewidths=0.5)
cb=fig.colorbar(ac,extend='both',shrink=1,label='相对湿度(%)',pad=0.01)
cb.ax.tick_params(axis='both',which='both',length=1,labelsize=6)
降水量填图
我使用的数据中的total precipitation是指每小时的降水量,而且单位是米!
tp.plot.contourf(ax=ax, cmap='Blues', transform=ccrs.PlateCarree())
ax.set_extent([105,120,18,30])
ac=ax.contourf(lons[248:288,420:480],lats[248:288,420:480],tp[248:288,420:480],levels=np.arange(0,20,2),
cmap='Blues',extend='both')
fig.colorbar(ac,extend='both',shrink=1,label='一小时累积降水量(mm)',pad=0.01)
其他的就是很普通很常规的操作了,成品图如下: