Matplotlib 3×3子图ylim不生效:仅最后一个子图Y轴范围异常
问题:Matplotlib 3×3子图仅右下角子图Y轴范围不符合设置
我尝试创建一组3×3的子图,要求所有子图使用相同的X轴和Y轴范围。但运行代码后发现,除右下角的最后一个子图外,其余子图均应用了正确的y轴范围(ylim)。
运行代码
import numpy as np import matplotlib.pyplot as plt import gc brightM = -22 # Plot range... limitM = -14 dataIn = np.load("testLFdata.tst.npy",allow_pickle=True) fig, axs = plt.subplots(nrows=3, ncols=3, sharex='all',sharey='all',figsize=(15,15)) linaxs = axs.reshape(-1) for i, ax in zip(range(dataIn[0].size), linaxs): print("z={}".format(dataIn[0,i])) xdata = dataIn[1,i][0] ydata = dataIn[1,i][1] ax.plot(xdata,ydata,ls='-',marker='o', c="b") # Format plt ax.set_yscale('log') ax.set_ylim([5e-6,1e-1]) ax.set_yticks(np.logspace(-6,-1,6)) ax.set_xscale('linear') ax.set_xlim([brightM-0.85,limitM+0.5]) ax.set_xticks(np.arange(brightM,limitM+1,2)) ax.set_xticklabels([str(i) for i in np.arange(brightM,limitM+1,2)]) ax.grid(b=True) gc.collect() plt.subplots_adjust(left=0.07, bottom=0.08, right=1.0, top=1.0, wspace=.0, hspace=.0) gc.collect()
问题现象
运行上述代码后,生成的绘图中仅右下角子图的Y轴范围不符合设置,其余子图均正常,效果如下:

解决方案
原因分析
问题根源在于sharey='all'的共享轴机制:当你在循环中逐个为共享轴子图设置轴范围时,Matplotlib的轴同步逻辑可能会出现冲突,导致最后一个子图的设置被覆盖或未生效。共享轴的子图会互相同步属性,重复设置会干扰内部状态。
修改后的代码
import numpy as np import matplotlib.pyplot as plt import gc brightM = -22 # Plot range... limitM = -14 dataIn = np.load("testLFdata.tst.npy",allow_pickle=True) # 创建共享轴子图 fig, axs = plt.subplots(nrows=3, ncols=3, sharex='all',sharey='all',figsize=(15,15)) linaxs = axs.reshape(-1) # 先完成所有子图的绘制 for i, ax in zip(range(dataIn[0].size), linaxs): print("z={}".format(dataIn[0,i])) xdata = dataIn[1,i][0] ydata = dataIn[1,i][1] ax.plot(xdata,ydata,ls='-',marker='o', c="b") ax.grid(b=True) gc.collect() # 利用共享轴特性,仅需设置一个子图的轴属性即可同步所有子图 ref_ax = linaxs[0] ref_ax.set_yscale('log') ref_ax.set_ylim([5e-6,1e-1]) ref_ax.set_yticks(np.logspace(-6,-1,6)) ref_ax.set_xscale('linear') ref_ax.set_xlim([brightM-0.85,limitM+0.5]) ref_ax.set_xticks(np.arange(brightM,limitM+1,2)) ref_ax.set_xticklabels([str(i) for i in np.arange(brightM,limitM+1,2)]) plt.subplots_adjust(left=0.07, bottom=0.08, right=1.0, top=1.0, wspace=.0, hspace=.0) gc.collect() plt.show()
关键说明
- 启用
sharex='all'和sharey='all'后,所有子图的轴属性会自动同步,因此只需修改任意一个子图的轴范围、刻度等,其他子图会自动继承。 - 避免在循环中重复设置共享轴的属性,统一在绘制完成后设置,可防止内部同步逻辑冲突,确保所有子图应用正确的轴范围。
内容的提问来源于stack exchange,提问作者earnric
相关产品推荐
相关产品推荐

