You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Matplotlib所有子图设置相同Y轴范围?

问题:Matplotlib子图统一Y轴范围失效的解决办法

我需要让绘制的6个子图拥有相同的Y轴数值范围,以便更好地对比数据。现有Matplotlib绘图代码如下:

fig, axs = plt.subplots(2, 3, figsize=(15,15))

axs[0,0].plot(drawdown[['Monthly Return Q1']] )
axs[0,0].set_title('Monthly Return Q1') 
axs[0,0].set_ylabel("percentage") 
axs[0,0].grid()
axs[0,0].set_xlabel("Years")

axs[0,1].plot(drawdown[['Monthly Return Q2']] )
axs[0,1].set_title('Monthly Return Q2') 
axs[0,1].set_ylabel("percentage") 
axs[0,1].grid()
axs[0,1].set_xlabel("Years")

axs[1,0].plot(drawdown[['Monthly Return Q3']] )
axs[1,0].set_title('Monthly Return Q3') 
axs[1,0].set_ylabel("percentage") 
axs[1,0].grid()
axs[1,0].set_xlabel("Years")

axs[1,1].plot(drawdown[['Monthly Return Q4']] )
axs[1,1].set_title('Monthly Return Q4') 
axs[1,1].set_ylabel("percentage") 
axs[1,1].grid()
axs[1,1].set_xlabel("Years")

axs[1,2].plot(drawdown[['MSCI USA - ESG Leader']] )
axs[1,2].set_title('MSCI USA - ESG Leader') 
axs[1,2].set_ylabel("percentage") 
axs[1,2].grid()
axs[1,2].set_xlabel("Years")

axs[0,2].plot(drawdown[['MSCI USA']] )
axs[0,2].set_title('MSCI USA') 
axs[0,2].set_ylabel("percentage") 
axs[0,2].grid()
axs[0,2].set_xlabel("Years")

我尝试了以下代码,但并未生效:

custom_ylim = (-0.35, 0)

plt.setp(ax, ylim=custom_ylim)

解决办法

你之前的代码失效原因是:axs是2×3的轴对象数组,而你用plt.setp(ax, ylim=custom_ylim)时,ax并没有指向所有子图的轴对象,需要先对axs做扁平化处理,再批量设置。

方法一:遍历所有子图设置Y轴范围

custom_ylim = (-0.35, 0)
# 扁平化数组,逐个设置每个子图的Y轴范围
for ax in axs.flat:
    ax.set_ylim(custom_ylim)

方法二:用plt.setp配合扁平化后的轴对象

custom_ylim = (-0.35, 0)
# 直接对扁平化后的所有轴对象批量设置Y轴范围
plt.setp(axs.flat, ylim=custom_ylim)

方法三:创建子图时直接共享Y轴

如果不需要自定义固定范围,而是让所有子图自动适配统一的Y轴范围,可以在创建子图时指定sharey=True:

# 创建子图时开启Y轴共享,自动统一范围
fig, axs = plt.subplots(2, 3, figsize=(15,15), sharey=True)
# 后续的绘图代码保持不变即可

以上三种方法都能让所有子图拥有相同的Y轴范围,方便数据对比。


内容的提问来源于stack exchange,提问作者Terminator6677

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:20:31