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
和二个纬度的对应坐标 lons
,lats
。
绘制填充图
确定投影方式,选择合适的色表,并绘制海岸线和网格。
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
。绘图结果如下图所示: