python绘制剖面图_python可视化 | 垂直剖面图&填色图绘制基础

剖面图使用的资料是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)

其他的就是很普通很常规的操作了,成品图如下:

你可能感兴趣的:(python绘制剖面图)