我看到过几个问题询问如何添加辅助 x 轴或 y 轴,但没有一个问题询问是否可以同时添加两个轴。
我知道ax.twinx()和分别ax.twiny()用于添加另一个y或x轴,但如何将两者添加在一起呢?
ax.twinx()
ax.twiny()
y
x
以下是两条具有不同 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()
其结果是:
我想要的是这样的:
其中右y轴和上x轴对应蓝色曲线。
这能做到吗?
是的,完全可以同时添加辅助 (x) 轴和 (y) 轴,并使每个轴独立控制它们各自的范围。通过使用 Matplotlib 的 twinx() 和 twiny(),可以在同一个图中实现这个功能。
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()
ax1.twiny()
ax3.set_xlim()
您将获得一张图,其中: