前言
当要展示大气要素的空间分布和变化规律时,绘制ERA5数据的等值线和填色图就变得尤为重要啦!这两种方法简单易行,让我们来看看它们吧。
首先,我们有MetPy库。这个家伙是专为大气科学数据分析和可视化而生的Python库,提供了丰富的绘图功能和气象学计算工具。用它来绘制等值线和填色图,简直就是小菜一碟!
其次,咱们还有meteva库。这货是国家气象中心预报技术研发室检验科负责研发的,专门用来快速高效地检验气象产品。它能够帮助我们制作气象产品,促进跨流程跨部门的检验信息共享,为改进预报质量提供技术支持。
无论是MetPy还是meteva,都能让我们轻松愉快地绘制出漂亮的等值线和填色图,让那些枯燥的数据变得生动起来!
方法一:metpy库绘制
导入库与读取数据
代码语言:javascript复制
代码语言:javascript复制from metpy.plots import ContourPlot, ImagePlot, MapPanel, PanelContainer
from metpy.units import units
import xarray as xr
nc = xr.open_dataset('/home/mw/input/era5tqzdfx9482/adaptor.mars.internal-1684907015.0619943-12842-1-c1fc11e0-4649-40a6-b30b-ef3afffd57fd.nc')
nc
数据处理:选择850hpa的位势高度
代码语言:javascript复制
代码语言:javascript复制contour = ContourPlot()
contour.data = nc
contour.field = 'z'
contour.level = 850 * units.hPa
contour.linecolor = 'red'
contour.contours = 15
contour.time = pd.to_datetime(nc.time[0].values.item())
代码语言:javascript复制
数据处理:选择850hpa的温度
代码语言:javascript复制
代码语言:javascript复制img = ImagePlot()
img.data = nc
img.field = 't'
img.level = 850 * units.hPa
img.time = pd.to_datetime(nc.time[0].values.item())
绘图
代码语言:javascript复制
代码语言:javascript复制panel = MapPanel()
panel.area = (110, 130, 20, 40)
panel.layers = ['coastline', 'borders', 'states', 'ocean', 'land']
panel.title = 'ERA5 test'
panel.plots = [contour, img]
pc = PanelContainer()
pc.size = (20, 12)
pc.panels = [panel]
pc.show()
代码语言:javascript复制
方法二:meteva库绘制
导入库
代码语言:javascript复制
代码语言:javascript复制#导入必要包
import meteva.base as meb
import numpy as np
import matplotlib.pyplot as plt
from meteva.base.tool.plot_tools import add_china_map_2basemap
plt.rcParams['font.sans-serif'] = ['Source Han Sans CN']
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
代码语言:javascript复制
读取数据与数据处理
代码语言:javascript复制
代码语言:javascript复制grid0 = meb.grid([110,130,0.25],[20,40,0.25]) #设置范围应小于或等于era5数据的原有范围
t = meb.io.read_griddata_from_nc('/home/mw/input/era5tqzdfx9482/adaptor.mars.internal-1684907015.0619943-12842-1-c1fc11e0-4649-40a6-b30b-ef3afffd57fd.nc',
grid = grid0,value_name="t") #读取网格数据,用于测试
z = meb.io.read_griddata_from_nc('/home/mw/input/era5tqzdfx9482/adaptor.mars.internal-1684907015.0619943-12842-1-c1fc11e0-4649-40a6-b30b-ef3afffd57fd.nc',
grid = grid0,value_name="z")
代码语言:javascript复制
绘图部分
代码语言:javascript复制
代码语言:javascript复制map_extend = [110,130,20,40]
axs = meb.creat_axs(1,map_extend, ncol=1, sup_title="era5 test", sup_fontsize=12,width=10,height=10)
image = meb.add_contour(axs[0],z.sel(level=850,time=z.time[0])/98,clevs = np.arange(120,180,2))
image = meb.add_contourf(axs[0],t.sel(level=850,time=z.time[0]),clevs = np.arange(280,320,4))
你喜欢哪一种绘制方法呢