小能豆

Matplotlib:两个 x 轴和两个 y 轴

py

我看到过几个问题询问如何添加辅助 x 轴或 y 轴,但没有一个问题询问是否可以同时添加两个轴。

我知道ax.twinx()和分别ax.twiny()用于添加另一个yx轴,但如何将两者添加在一起呢?

以下是两条具有不同 x,y 范围的曲线的示例:

import matplotlib.pyplot as plt
import numpy as np

# Generate two sets of random data.
x1 = np.random.randn(50)
y1 = np.linspace(0, 1, 50)
x2 = np.random.randn(20)+15.
y2 = np.linspace(10, 20, 20)

# Plot both curves.
fig = plt.figure()

ax1 = fig.add_subplot(121)
plt.plot(x1, y1, c='r')

ax2 = fig.add_subplot(122)
plt.plot(x2, y2, c='b')

plt.show()

其结果是:

o7DC4.png

我想要的是这样的:

XGL4z.png

其中右y轴和上x轴对应蓝色曲线。

这能做到吗?


阅读 24

收藏
2024-11-17

共1个答案

小能豆

是的,完全可以同时添加辅助 (x) 轴和 (y) 轴,并使每个轴独立控制它们各自的范围。通过使用 Matplotlib 的 twinx()twiny(),可以在同一个图中实现这个功能。

以下是实现您所需效果的完整代码:

import matplotlib.pyplot as plt
import numpy as np

# 数据
x1 = np.linspace(0, 1, 50)
y1 = np.random.randn(50)

x2 = np.linspace(10, 20, 20)
y2 = np.random.randn(20) + 15

# 创建主图
fig, ax1 = plt.subplots()

# 绘制第一条曲线(红色)
ax1.plot(x1, y1, 'r-', label='Red Curve')
ax1.set_xlabel('X1 (Red)')
ax1.set_ylabel('Y1 (Red)', color='r')
ax1.tick_params(axis='y', labelcolor='r')

# 添加第二个 y 轴
ax2 = ax1.twinx()
ax2.plot(x2, y2, 'b-', label='Blue Curve')
ax2.set_ylabel('Y2 (Blue)', color='b')
ax2.tick_params(axis='y', labelcolor='b')

# 添加第二个 x 轴
ax3 = ax1.twiny()
ax3.set_xlim(ax1.get_xlim())  # 确保 x 轴范围一致
ax3.set_xlabel('X2 (Blue)')
ax3.plot([], [])  # 为了不重复添加曲线,这里使用空绘图

# 调整布局避免标签重叠
fig.tight_layout()

plt.show()

结果解释

  • 红色曲线:使用主 (x) 轴和 (y) 轴。
  • 蓝色曲线:使用右侧的辅助 (y) 轴(twinx())和顶部的辅助 (x) 轴(twiny())。
  • 使用 ax1.twiny() 创建顶部辅助 (x) 轴并通过 ax3.set_xlim() 同步 (x) 轴范围,避免图形错乱。

输出效果

您将获得一张图,其中:

  • 左侧 (y) 轴对应红色曲线。
  • 右侧 (y) 轴和顶部 (x) 轴对应蓝色曲线。
2024-11-17