繁体   English   中英

如何使用Python绘制GFS grib2数据?

[英]How do I plot GFS grib2 data with Python?

我希望在我的网站上有一个包含接下来几天温度的图表,全球预测系统最符合我的需求。 如何在matplotlib中绘制GRIB2数据并从图中创建PNG图像?

我花了几个小时在互联网上搜索,询问那些知道如何做到这一点的人(他们根本没有帮助),我不知道从哪里开始。 GFS数据可以在这里找到: ftp//ftp.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/如果可能的话,我希望它是轻量级的,不会丢失太多的服务器空间。

当您考虑使用轻量级数据使用和存储时,您可以考虑使用除GRIB之外的其他数据形式。 GRIB文件通常包含全球数据,当您只想绘制特定域时,这些数据非常无用。

我强烈建议使用NOAA-NCEP opendap数据服务器中的数据。 您可以使用netCDF4从此服务器获取数据。 不幸的是,已知该服务器在某些时候是不稳定的,这可能导致刷新运行和/或格式错误的数据集的延迟。 虽然,在95%的时间里,我可以访问我需要的所有数据。

注意:由于新运行发布后的高人口贩运,此数据服务器可能会很慢。 可以在此处找到数据服务器的访问权限: http//nomads.ncdc.noaa.gov/data.php?name = access_hires_weather_datasets

使用Matplotlib和Basemap工具包绘制数据非常简单。 一些示例,包括GFS数据集的使用,可以在这里找到: http//matplotlib.org/basemap/users/examples.html

基本上,有两个步骤:

  1. 使用wgrib从grib2数据中提取所选变量,并保存到NetCDF文件中。 虽然有一些API如pygrib,但我发现直接使用命令行工具的麻烦较少。 一些有用的链接:

安装: http//www.cpc.ncep.noaa.gov/products/wesley/wgrib2/compile_questions.html
技巧: http//www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/tricks.wgrib2

例如,提取温度和湿度:

wgrib2 test.grb2 -s | egrep '(:RH:2 m above ground:|:TMP:2 m above ground:)'|wgrib2 -i test.grb2 -netcdf test.nc
  1. 使用Python库来处理NetCDF文件,示例代码可能如下所示:

    进口警告
    warnings.filterwarnings( “忽略”)
    将matplotlib.pyplot导入为plt
    导入numpy为np
    将pandas导入为pd
    %matplotlib内联
    来自netCDF4导入数据集
    来自mpl_toolkits.basemap导入底图
    来自pyproj import Proj
    将matplotlib.cm导入为cm
    导入日期时间

    file =“test.nc”
    rootgrp =数据集(文件,“r”)
    x = rootgrp ['longitude'] [:]#0-359,step = 1
    y = rootgrp ['latitude'] [:]#-90~90,step = 1
    tmp = rootgrp ['TMP_2maboveground'] [:] [0] #form(181,360)dt = datetime.datetime(1970,1,1)+ datetime.timedelta(seconds = rootgrp ['time'] [0])

    fig = plt.figure(dpi = 150)
    m =底图(projection ='mill',lat_ts = 10,llcrnrlon = x.min(),urcrnrlon = x.max(),llcrnrlat = y.min(),urcrnrlat = y.max(),resolution ='c “)

    xx,yy = m(* np.meshgrid(x,y))
    m.pcolormesh(XX,YY,TMP-273.15,遮光= '平面',CMAP = plt.cm.jet)
    m.colorbar(位置= '右')

    m.drawcoastlines()
    m.drawparallels(np.arange(-90。,120。,30。),labels = [1,0,0,0],fontsize = 10)
    m.drawmeridians(np.arange(0。,360。,60。),labels = [0,0,0,1],fontsize = 10)
    plt.title(“{},GFS,Temperature(C)”。format(dt.strftime('%Y-%m-%d%H:%M UTC')))
    plt.show()

示例图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM