Matplotlib - 双轴
Matplotlib - 双轴 (Twin Axes)
Section titled “Matplotlib - 双轴 (Twin Axes)”有时,在同一绘图区域上显示两个不同的数据集非常有用,但这些数据集的刻度或单位可能存在显著差异。将它们直接绘制在同一 y 轴上可能会导致其中一个数据集难以阅读或解释。
Matplotlib 允许您创建双轴 (twin axes),它们是附加的 Axes 对象,与原始轴共享相同的 x 轴 (twinx()) 或 y 轴 (twiny()),但在绘图的另一侧拥有自己的独立 y 轴或 x 轴。
使用 ax.twinx()
Section titled “使用 ax.twinx()”这是最常见的用例:在绘图右侧创建第二个 y 轴,该轴与原始(左侧)y 轴共享 x 轴。
ax2 = ax1.twinx() # ax1 是原始 Axes 对象ax2 是一个新的 Axes 对象。您可以使用 ax2.plot() 绘制数据,使用 ax2.set_ylim() 设置其 y 轴限制,以及使用 ax2.set_ylabel() 为其 y 轴添加标签。重要的是,ax2 与 ax1 共享 x 轴,因此对 x 轴的缩放或平移会影响两者。
示例:在同一图表上绘制温度和降水量。
import matplotlib.pyplot as pltimport numpy as np
# 样本数据:月平均温度和降水量months = np.arange(1, 13)temperature = np.array([0, 2, 5, 10, 15, 18, 20, 19, 15, 10, 5, 1]) # 摄氏度 (°C)precipitation = np.array([70, 60, 50, 40, 30, 20, 15, 20, 35, 50, 65, 75]) # 毫米 (mm)
fig, ax1 = plt.subplots(figsize=(10, 5))
# 在主 y 轴(左侧)上绘制温度color1 = 'tab:red'ax1.set_xlabel('月份')ax1.set_ylabel('温度 (°C)', color=color1)line1 = ax1.plot(months, temperature, color=color1, marker='o', label='温度')ax1.tick_params(axis='y', labelcolor=color1)ax1.set_xticks(months)ax1.grid(True, axis='x', linestyle=':', alpha=0.7)
# 创建共享 x 轴的双轴ax2 = ax1.twinx()
# 在次 y 轴(右侧)上绘制降水量color2 = 'tab:blue'ax2.set_ylabel('降水量 (mm)', color=color2) # x 轴标签已由 ax1 处理line2 = ax2.bar(months, precipitation, color=color2, alpha=0.6, label='降水量') # 对降水量使用柱状图ax2.tick_params(axis='y', labelcolor=color2)ax2.set_ylim(0, max(precipitation) * 1.2) # 调整柱状图的限制
# --- 添加图例 ---# 合并来自两个轴的图例可能比较棘手。一种方法是:lines = [line1[0], line2] # 获取绘图对象labels = [l.get_label() for l in lines]ax1.legend(lines, labels, loc='upper center') # 使用 ax1 添加图例
fig.suptitle('月平均温度和降水量')fig.tight_layout() # 调整布局plt.show()使用 ax.twiny()
Section titled “使用 ax.twiny()”ax.twiny() 不太常见,它创建第二个 x 轴(通常在顶部),该轴与原始轴共享 y 轴。
ax2 = ax1.twiny() # ax1 是原始 Axes 对象如果您希望将相同的 y 数据对照两个不同的 x 轴刻度或变量显示,这可能会很有用。
双轴对于组合具有不同刻度的图非常强大,但请谨慎使用。过多的信息叠加或使用掩盖关系的刻度会使图表变得令人困惑而不是信息丰富。确保清晰的标签,并考虑使用颜色将线条/柱状图与其各自的轴关联起来。