You need to enable JavaScript to run this app. Python3.8下MetPy声明式绘制GRIB2文件仅显示空白地图问题排查
优惠活动
大模型
产品
解决方案
定价
更多

Python3.8下MetPy声明式绘制GRIB2文件仅显示空白地图问题排查

问题原因

数据无法渲染的核心问题是经度坐标系不匹配:

  • cfgrib读取的GFS原始数据经度范围为0~360°
  • MetPy声明式绘图的us区域默认匹配-180~180°的经度范围,数据坐标和显示区域无重叠,因此只会显示空白底图。
    出现的多时间坐标警告不会影响渲染,可通过删除冗余坐标消除。

修复后代码

import matplotlib.pyplot as plt
import xarray as xr
import numpy as np
import pygrib
import cartopy.crs as ccrs
import cartopy.feature as cfeat
import cartopy
from datetime import datetime, timedelta
import io
from metpy.units import units
from metpy.plots import ImagePlot, MapPanel, PanelContainer

# 读取GFS grib2文件,筛选气压层数据
ds = xr.open_dataset('/fewxops/Tom/learn_python/data/grib2/gfs.t00z.pgrb2.0p25.f024', engine='cfgrib', filter_by_keys={'typeOfLevel': 'isobaricInhPa'})

# 选择500hPa层,可新增drop参数消除多时间坐标警告
ds_z500 = ds.sel(isobaricInhPa=500).drop(['time', 'step'], errors='ignore')

# --------------------新增修复代码--------------------
# 转换经度从0~360范围到-180~180范围,再按经度排序
ds_z500 = ds_z500.assign_coords(longitude=(((ds_z500.longitude + 180) % 360) - 180)).sortby('longitude')
# 调用MetPy的CF元数据解析方法,正确识别坐标、单位和投影信息
ds_z500 = ds_z500.metpy.parse_cf()
# ---------------------------------------------------

# 创建绘图图层
img = ImagePlot()
img.data = ds_z500
img.field = 't'
img.colormap = 'plasma'
# 可选:设置温度显示单位为摄氏度
# img.plot_units = 'degC'

# 创建地图面板
panel = MapPanel()
panel.area = 'us'
panel.layers = ['states']
panel.title = 'GFS 500mb Temp Forecast Example'
panel.plots = [img]

# 创建容器并渲染
pc = PanelContainer()
pc.size = (10,8)
pc.panels = [panel]
pc.show()

补充说明

如果需要绘制全球区域,无需转换经度,仅需将panel.area = 'us'修改为panel.area = 'global'即可正常渲染。

内容的提问来源于stack exchange,提问作者wxninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 23:27:07