本文以绘制垂直廓线图为例说明在 Matplotlib 中如何在左右坐标轴上绘制不同的坐标。
准备
载入需要的库
import matplotlib.pyplot as plt
import numpy as np
from nwpc_data.grib.eccodes import load_field_from_file
from nwpc_data.data_finder import find_local_file
数据
本文绘制 GRAPES GFS 模式 2020 年 10 月 18 日 00 时次 105 时效北纬 40 度的平均垂直廓线图。
查找数据文件路径
file_path = find_local_file(
"grapes_gfs_gmf/grib2/orig",
start_time="2020101800",
forecast_time="105h",
)
载入所有等压面层的温度场
short_name = "t"
level_type = "pl"
field = load_field_from_file(
file_path=file_path,
parameter=short_name,
level_type=level_type,
)
field
![6fbe5c91aecc537cf78e79cd719ca7fd.png](https://i-blog.csdnimg.cn/blog_migrate/1c525cc59225a0b04b28c734133cf327.png)
提取北纬 40 度从 1000 hPa 到 20 hPa 的数据
data = field.sel(
pl=slice(1000, 20)
).sel(
latitude=40,
method="nearest",
)
data
![38d4f89d6844d8acda4c46c5ac862c08.png](https://i-blog.csdnimg.cn/blog_migrate/7aeae15b952bc52ea0c6ed57ffbc35ec.png)
计算均值
mean_data = data.mean(dim="longitude")
mean_data
![bd2746f9c3879435966c006ad8d550ad.png](https://i-blog.csdnimg.cn/blog_migrate/81c6ec85fc08e59338abd3ceb11df732.png)
绘制第一个坐标
构造层次列表
level_nos = np.arange(1, len(mean_data.pl) + 1)
level_nos
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29])
绘制廓线图,在左坐标轴上绘制气压值作为 Y 轴坐标
fig, ax = plt.subplots(figsize=(5, 8))
ax.plot(mean_data.values, level_nos)
ax.invert_yaxis()
ax.set_ylim(level_nos[0], level_nos[-1])
ax.set_yticks(level_nos)
ax.set_yticklabels(mean_data.pl.values)
ax.set_ylabel("pl", fontsize=12)
ax.set_xlabel("temperature", fontsize=12)
plt.show()
![c5d728b247fa2e412eccafbe5f7199fc.png](https://i-blog.csdnimg.cn/blog_migrate/391c8d5741afb839df2bbc1913b679b5.png)
绘制第二个坐标
将层次列表绘制在右坐标轴上
使用 ax2 = ax.twinx()
创建与上图共享 X 轴的新图形,只绘制 Y 坐标。
fig, ax = plt.subplots(figsize=(5, 8))
ax.invert_yaxis()
ax.plot(mean_data.values, level_nos)
ax.set_ylim(level_nos[0], level_nos[-1])
ax.set_yticks(level_nos)
ax.set_yticklabels(mean_data.pl.values)
ax.set_ylabel("pl", fontsize=12)
ax.set_xlabel("temperature", fontsize=12)
ax2 = ax.twinx()ax2.set_yticks(level_nos)ax2.set_ylim(level_nos[0], level_nos[-1])ax2.set_yticklabels(level_nos)ax2.set_ylabel("level", fontsize=12)
plt.show()
![c756bf094f05f5629dca2b5275dd9d38.png](https://i-blog.csdnimg.cn/blog_migrate/bb1b651046bb0860c515d4476363675d.png)
本文没有使用对数坐标轴,后续有待改进。
参考
https://stackoverflow.com/questions/14762181/adding-a-y-axis-label-to-secondary-y-axis-in-matplotlib
《GRIB笔记:使用cfgrib加载垂直剖面图数据》
《GRIB笔记:使用eccodes-python加载垂直剖面图数据》