如何用Matplotlib创建含两个双Y轴子图的图表?
创建带双Y轴的多子图(Matplotlib)
当你需要创建多个带双Y轴的子图时,只需在多子图布局的基础上,给每个子图单独调用twinx()生成双Y轴即可,核心逻辑和单个图表的双Y轴操作一致。
核心步骤说明
- 用
plt.subplots()指定子图布局:比如创建2行1列的子图,使用fig, axes = plt.subplots(nrows=2, ncols=1),此时axes是包含两个轴对象的数组,每个元素对应一个子图的主Y轴。 - 对每个子图的主轴,调用
twinx()生成对应的副Y轴,分别配置各自的曲线、标签和样式。
完整示例代码
import matplotlib.pyplot as plt import numpy as np # 生成示例数据 x = np.linspace(0, 10, 100) y1 = np.sin(x) y2 = np.exp(x/10) y3 = np.cos(x) y4 = np.log(x+1) # 创建2行1列的子图布局,设置整体尺寸 fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(8, 10)) # 处理第一个子图 ax1 = axes[0] # 主Y轴曲线 ax1.plot(x, y1, color='tab:blue', label='正弦曲线') ax1.set_xlabel('X轴') ax1.set_ylabel('左侧Y轴', color='tab:blue') ax1.tick_params(axis='y', labelcolor='tab:blue') ax1.legend(loc='upper left') # 第一个子图的副Y轴 ax1_twin = ax1.twinx() ax1_twin.plot(x, y2, color='tab:orange', label='指数曲线') ax1_twin.set_ylabel('右侧Y轴', color='tab:orange') ax1_twin.tick_params(axis='y', labelcolor='tab:orange') ax1_twin.legend(loc='upper right') # 处理第二个子图 ax2 = axes[1] # 主Y轴曲线 ax2.plot(x, y3, color='tab:green', label='余弦曲线') ax2.set_xlabel('X轴') ax2.set_ylabel('左侧Y轴', color='tab:green') ax2.tick_params(axis='y', labelcolor='tab:green') ax2.legend(loc='upper left') # 第二个子图的副Y轴 ax2_twin = ax2.twinx() ax2_twin.plot(x, y4, color='tab:red', label='对数曲线') ax2_twin.set_ylabel('右侧Y轴', color='tab:red') ax2_twin.tick_params(axis='y', labelcolor='tab:red') ax2_twin.legend(loc='upper right') # 自动调整子图间距,避免标签重叠 fig.tight_layout() plt.show()
关键注意事项
- 区分每个子图的轴对象:不要混淆
axes[0]和axes[1]对应的子图,各自的副Y轴也独立生成 - 为不同Y轴设置不同颜色,方便区分数据
- 使用
legend()时指定位置,避免曲线和图例重叠
内容的提问来源于stack exchange,提问作者user20856754
相关产品推荐
相关产品推荐

