Matplotlib学习笔记:绘制等值线和填充图

目录

等值线和填充图属于同一种类型的图形。

气象上的填充图的数据包括两个部分:格点数据和地图数据。格点数据是一个二维数组,每个点都有一个经纬度坐标,对应地图上的一个点。地图是固定的,通常由绘图库本身提供。

填充图的绘图包括两个方面:绘制地图,在地图上绘制填充图。绘制地图涉及到确定地图投影以及绘制地图的哪些元素。绘制填充图包括样式、色表、等值线计算等等。

Matplotlib 库提供contourf函数绘制二维数组的填充图,提供contour函数绘制等值线图。

Cartopy 库提供地图和投影功能。

Numpy 库提供表示格点数据的数据结构。

结合上面三个库,就可以绘制气象上的填充图。

准备环境

安装需要的 python 库:matplotlib、cartopy 和 numpy。

我要绘制的数据保存在 GRIB2 格式的文件中,所以还需要安装解码 GRIB2 数据的库,例如 eccodes。

这里我使用基于 eccodes 开发的 python3 绑定库 nuwe-pyeccodes

准备数据

定位想要绘图的 GRIB2 消息。

file_path = "some-file-dir/gmf.gra.2018081800003.grb2"
message_number = 85
grib_file = nuwe_pyeccodes.GribFileHandler()
grib_file.openFile(file_path)
grib_message = None
for i in range(0, message_number):
    grib_message = grib_file.next()

构造经纬度坐标。

left_lon = grib_message.getDouble('longitudeOfFirstGridPointInDegrees')
right_lon = grib_message.getDouble('longitudeOfLastGridPointInDegrees')
lon_step = grib_message.getDouble('iDirectionIncrementInDegrees')
nx = grib_message.getLong('Ni')

lon_array = np.arange(left_lon, right_lon + lon_step / 2, lon_step)
top_lat = grib_message.getDouble('latitudeOfFirstGridPointInDegrees')
bottom_lat = grib_message.getDouble('latitudeOfLastGridPointInDegrees')
lat_step = grib_message.getDouble('jDirectionIncrementInDegrees')
ny = grib_message.getLong('Nj')

lat_array = np.arange(top_lat, bottom_lat - lat_step / 2, -lat_step)
lons, lats = np.meshgrid(lon_array, lat_array)

构造二维数组。

values = grib_message.getDoubleArray('values')
grid_values = values.reshape(ny, nx)

这样就得到数据 grid_values 和二个纬度的对应坐标 lonslats

绘制填充图

确定投影方式,选择合适的色表,并绘制海岸线和网格。

ax = plt.subplot(111, projection=ccrs.PlateCarree(central_longitude=180))
ax.contourf(
    lons, lats, grid_values,
    transform=ccrs.PlateCarree(),
    cmap='rainbow'
)
ax.coastlines()
ax.gridlines()
plt.show()

最终的绘图结果如下图所示:

绘制等值线图

与上文相似,将contourf改为contour。绘图结果如下图所示:

参考

Filled contours

nuwe-pyeccodes

代码示例