两种简单ERA5绘制等值线与填色图的方式

2024-06-20 18:06:49 浏览数 (2)

前言

当要展示大气要素的空间分布和变化规律时,绘制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))

你喜欢哪一种绘制方法呢

0 人点赞