如何让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
相关产品推荐
相关产品推荐

