如何为matplotlib的2x2子图网格设置统一固定的y轴取值范围
问题原因
你之前的设置没有生效,核心原因是plt.ylim()是pyplot的全局方法,仅会修改当前处于激活状态的子图,循环遍历ax对象时调用plt.ylim()不会自动绑定到当前遍历的子图实例上,因此只有最后一个激活的子图会被修改,其余子图无变化。
解决方案
方案1:创建子图时直接共享Y轴(最简便)
在初始化子图时添加sharey=True参数,所有子图会自动使用统一的Y轴范围,如果你需要和第一个子图范围对齐,也可以配合手动获取第一个子图范围的逻辑使用:
# 初始化时直接开启Y轴共享,所有子图Y轴自动同步 fig, axs = plt.subplots(2, 2, sharey=True) # 后续绘图代码保持不变即可 axs[0, 0].plot(x, y) axs[0, 0].set_title("Non Faulty Acc X Data") axs[0, 1].plot(x2, y2, 'tab:orange') axs[0, 1].set_title('Non Faulty Acc X Data') axs[1, 0].plot(x3, y3, 'tab:green') axs[1, 0].set_title('Faulty Acc X Data') axs[1, 1].plot(x4, y4, 'tab:red') axs[1, 1].set_title('Faulty Acc X Data')
方案2:手动遍历子图设置Y轴范围
如果你需要明确指定所有子图和第一个子图的Y轴范围完全对齐,可以先获取第一个子图的Y轴上下限,再调用每个子图实例的set_ylim()方法设置:
# 先获取第一个子图的Y轴范围 ymin, ymax = axs[0, 0].get_ylim() # 遍历所有子图,单独设置每个子图的Y轴范围 for ax in axs.flat: ax.set_ylim(ymin, ymax) ax.set(ylabel='Time')
如果你不需要和第一个子图对齐,而是要固定Y轴为0到1,直接把set_ylim的参数改为0,1即可:
ax.set_ylim(0, 1)
内容的提问来源于stack exchange,提问作者datascidude12123123
相关产品推荐
相关产品推荐

