HOWTO · Matplotlib
如何在 Matplotlib 中的第二 Y 轴上添加 Y 轴标签
我们可以通过与 axes 对象交互并直接使用 pandas.DataFrame.plot 方法在 Matplotlib 中的次要 y 轴上添加 y 轴标签。
本页内容
在 Matplotlib 中为次 y 轴添加标签,可以对 Axes.twinx() 返回的次级 axes 调用 set_ylabel()。返回的 axes 对象与图表共用 x 轴,并在另一侧提供独立的 y 轴。标签应清楚说明所测量的量;必要时也可注明单位。
使用 twinx() 为次 y 轴添加标签
使用 ax.twinx() 创建第二个 axes,将第二组数据绘制在其上,然后直接为它设置标签。这个完整示例定义了两条线的颜色,并使用 tight_layout() 为标签留出空间。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 5, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), color="tab:blue")
ax.set_xlabel("Time (s)")
ax.set_ylabel("sin(x)", color="tab:blue")
ax.tick_params(axis="y", labelcolor="tab:blue")
ax2 = ax.twinx()
ax2.plot(x, np.cos(x), color="tab:orange")
ax2.set_ylabel("cos(x)", color="tab:orange")
ax2.tick_params(axis="y", labelcolor="tab:orange")
fig.tight_layout()
plt.show()
ax2 是次级 axes,因此 ax2.set_ylabel(...) 会将标签放在右侧 y 轴上。如果改为对 ax 调用 set_ylabel(),则会修改左侧主 y 轴的标签。将标签和刻度颜色与对应线条匹配是可选的,但这样做有助于读者区分两种刻度。
显示第一个示例时,水平轴的标签为 Time (s)。蓝色正弦曲线使用左侧 y 轴,橙色余弦曲线使用右侧 y 轴。两条曲线覆盖相同的时间值,但每条曲线都应参照图表对应一侧的垂直刻度来读取。本文的特色图片展示的是 Height 和 Weight 两个坐标轴;它是独立的插图,并未呈现这两条正弦和余弦曲线。
调整 y 轴标签以提高清晰度
选择能说明测量量及其单位的文字,例如 Temperature (°C) 或 Pressure (kPa)。样式调整并非必需;如果有助于阅读,可以向 set_ylabel() 传入 color、fontsize 或 fontweight 等参数。两个标签应有所区别,也不要只靠颜色说明哪组数据对应哪种刻度。
下面的示例将这些样式选项应用到一张图表上:左侧刻度表示摄氏温度,右侧刻度表示千帕压力:
import matplotlib.pyplot as plt
import numpy as np
hours = np.arange(0, 24, 2)
temperature = 18 + 4 * np.sin((hours - 9) * np.pi / 12)
pressure = 101.3 + 0.8 * np.cos((hours - 6) * np.pi / 12)
fig, ax = plt.subplots()
ax.plot(hours, temperature, color="tab:red", marker="o")
ax.set_xlabel("Hour of day")
ax.set_ylabel(
"Temperature (°C)", color="tab:red", fontsize=12, fontweight="bold"
)
ax.tick_params(axis="y", labelcolor="tab:red")
ax2 = ax.twinx()
ax2.plot(hours, pressure, color="tab:green", marker="s")
ax2.set_ylabel(
"Pressure (kPa)", color="tab:green", fontsize=12, fontweight="bold"
)
ax2.tick_params(axis="y", labelcolor="tab:green")
fig.tight_layout()
plt.show()
每个标签都应简短说明如何理解图表该侧的数值,如上面的示例所示。文字和单位能说明数字的含义;让标签颜色与线条颜色一致,则是额外的视觉提示。如果标签显得拥挤,tight_layout() 可以调整图表间距;不过,标签过长时仍可能需要加大图表尺寸或缩短文字。
使用 DataFrame.plot 为次 y 轴添加标签
处理 pandas 数据时,绘制第二组数据并设置 secondary_y=True 时,可通过 ax 传入第一次绘图返回的 axes。每次调用 DataFrame.plot 都会返回一个 axes 对象:第一次返回主 axes,第二次返回次级 axes。应分别在对应对象上设置标签。
import matplotlib.pyplot as plt
import pandas as pd
frame = pd.DataFrame({
"age": [10, 20, 30, 40],
"height": [120, 140, 160, 170],
"weight": [30, 45, 60, 70],
})
ax = frame.plot(x="age", y="height", color="tab:blue")
ax2 = frame.plot(
x="age", y="weight", secondary_y=True, ax=ax, color="tab:orange"
)
ax.set_ylabel("Height (cm)")
ax2.set_ylabel("Weight (kg)")
plt.tight_layout()
plt.show()
这里,secondary_y 会为 weight 选择右侧刻度,而 ax=ax 会将这组数据叠加到同一张图中。如果使用了不同的列名或单位,请同时更新 y 参数和标签,让它们准确描述绘制的数据。
对于此示例中的数值,生成的图表以 age 为水平轴,左侧为 Height (cm),右侧为 Weight (kg)。蓝色的 height 线随四个年龄值增加而上升,橙色的 weight 线也随之上升;读者应依据各自的 y 轴标签和刻度来理解这两条线。更改所选列或单位时,标签也应相应更新。传入现有的 ax 可将两组数据保留在同一张图中,而 secondary_y=True 会将第二组数据分配到右侧刻度。