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

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轴范围不符合设置,其余子图均正常,效果如下:

9张子图


解决方案

原因分析

问题根源在于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:21:05