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
相关产品推荐
相关产品推荐

