作者:吉林通化局崔忠强 关键词:Meteva、会商复盘、降水对比、快捷可视化
前几天看省局组织的天气复盘,发现有一张图挺实用——每一行是一个模式,每一列是一个时效,一张图就可以把所有模式的制定预报时效展示出来了,
不用再去智能网格平台挨个截图了。感觉会商能很实用,就复现了一下。
考虑到能一键设置shp,也能一键生成多个axe,所以就继续偷懒采用meteva的便捷绘图工具。可以维护一个二位列表存储降水数据,然后依次绘制。
唯独比较“难”的地方就是如何在大图中把大图的纵坐标(模式名)和横坐标(时效)显示出来。
想了个笨方法,每一行的第一个图片给y轴设置一个label来显示模式名。每一列的第一个图片设置一个title来显示时效。
总之是复现出来了,欢迎大家交流优化!

效果示例
要点 | 内置支持 |
|---|---|
数据读取 | 自动算 YYMMDDHH.TTT,读 RAIN12 |
起报时间 | 支持 20:00(昨天)/ 08:00(当天)一键切 |
模式列表 | 随意增删,动态计算行列 |
地图范围 | extent=[110,125,35,45] 自定义即可 |
色标 | Meteva 自带 24h 降水色标 |
分辨率 | dpi=300,bbox_inches='tight' |
直接整段扔进 draw_models.py,安装一次依赖即可跑。
import numpy as np
import meteva.base as meb
import datetime
from metdig.io.cmadaas import get_model_grids
import matplotlib.pyplot as plt
#导入配置ini
meb.set_io_config(r"C:\Users\admin\OneDrive\config\meteva\config.ini")
def draw_map(members=["ECMWF_HR","GERMAN_HR","GRAPES_GFS","GRAPES_3KM","NCEP_GFS","JAPAN_MR",'GRAPES_MESO_HR', 'BEIJING_MR', 'GUANGZHOU_MR','NWFD_SCMOC'],fhours=np.arange(12,84,12),extent=[110,125,35,45],is_20=True):
'''
members (列表): 天气模型名称列表。
fhours (numpy 数组): 预报小时数组。默认值: np.arange(12,84,12)
extent (列表): 地图范围坐标列表。默认值: [110,125,35,450]
is_20 (布尔值): 标志,指示预报是否从20:00开始。默认值: True
'''
#初始化结果的xarray列表,实际上是一个二维数组
data_list=[]
#如果是早间会商,一般使用昨天20点起报的数据,如果是下午加密会商,一般使用今天8点起报的数据。这里用来自动生成起报时间
if is_20:
time_now = datetime.datetime.now() - datetime.timedelta(hours = 24)
time0 = datetime.datetime(time_now.year,time_now.month,time_now.day,20,0)
else:
time_now = datetime.datetime.now()
time0 = datetime.datetime(time_now.year,time_now.month,time_now.day,8,0)
#对每一个模式进行循环
for member in members:
#初始化单模式的结果列表
grd_list=[]
#对每一个时次进行循环
for fhour in fhours:
#通过meteva读取micaps的分布式服务器的数据,首先生成路径
path = meb.get_path(r"%s/RAIN12/YYMMDDHH.TTT"%member,time0,fhour)
try:
grd = meb.read_griddata_from_gds(path)
grd_list.append(grd)
except:#如果读取失败,就用np.nan填充,保证维度一致
grd_list.append(np.nan)
print(member,':',fhour,' done')#输出日志
data_list.append(grd_list)
#这里生成一个时间列表,用于在每一列顶端显示预报时间
times = []
for fhour in fhours:
times.append((time0+datetime.timedelta(hours = int(fhour))).strftime('%d%H'))
#利用meteva的便捷绘图工具创造子图
axs = meb.creat_axs(len(members)*len(fhours),extent,ncol = len(fhours),sup_title='',sup_fontsize = 6,add_minmap=False)
#遍历所有数据绘图
for i in range(len(members)):
for j in range(len(fhours)):
image = meb.add_contourf(axs[i*len(fhours)+j],data_list[i][j],cmap = meb.cmaps.rain_24h,add_colorbar=False,extend = 'both')
#左边添加模式名
for i, label in enumerate(members):
axs[i*len(fhours)].set_ylabel(label, fontsize=6, rotation=90, ha='center')
#顶部添加预报时间
for i, label in enumerate(times):
axs[i].set_title(label, fontsize=6, pad=10)
plt.savefig('result.png',dpi=300,bbox_inches='tight')
members=["ECMWF_HR",
"NCEP_GFS",
"GRAPES_GFS",
"GERMAN_HR",
"JAPAN_MR",
'GRAPES_MESO_HR',
'NWFD_SCMOC']
draw_map(members=members,fhours=np.arange(12,84,12),is_20=True)
creat_axs/add_contourf 已经帮我们完成了子图布局、投影、色标等脏活累活。咱们留言区不见不散!