Matplotlib绘制双坐标轴

目录

本文以绘制垂直廓线图为例说明在 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

提取北纬 40 度从 1000 hPa 到 20 hPa 的数据

data = field.sel(
    pl=slice(1000, 20)
).sel(
    latitude=40, 
    method="nearest",
)
data

计算均值

mean_data = data.mean(dim="longitude")
mean_data

绘制第一个坐标

构造层次列表

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()

绘制第二个坐标

将层次列表绘制在右坐标轴上

使用 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()

本文没有使用对数坐标轴,后续有待改进。

参考

https://stackoverflow.com/questions/14762181/adding-a-y-axis-label-to-secondary-y-axis-in-matplotlib

GRIB笔记:使用cfgrib加载垂直剖面图数据

GRIB笔记:使用eccodes-python加载垂直剖面图数据