首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >业务刚需 |一张图看遍所有模式:用 Meteva 速览 12~72h 降水预报

业务刚需 |一张图看遍所有模式:用 Meteva 速览 12~72h 降水预报

作者头像
用户11172986
发布2026-04-24 18:55:57
发布2026-04-24 18:55:57
550
举报
文章被收录于专栏:气python风雨气python风雨

一张图看遍所有模式:用 Meteva 速览 12~72h 降水预报

作者:吉林通化局崔忠强 关键词: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,安装一次依赖即可跑。

代码语言:javascript
复制
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)


小结

  • 有了这张图,早间会商的降水环节至少能省下 一张 A4+3 min 的汇报时间。
  • meteva 提供的 creat_axs/add_contourf 已经帮我们完成了子图布局、投影、色标等脏活累活。
  • 最后两行坐标标签,虽是“笨办法”,但足够清晰,也免去了拼接图像的二次折腾。

咱们留言区不见不散!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一张图看遍所有模式:用 Meteva 速览 12~72h 降水预报
    • 前言
    • 项目功能速览
    • 代码
    • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档