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

重复调用含gridspec的绘图函数仅显示最后一张图的求助

问题解决:重复调用FancyPlot仅显示最后一张图

问题根源

  1. 未创建独立绘图窗口:你的函数每次调用时,都会在Matplotlib的全局默认绘图窗口(Figure)上绘制子图,后续调用的内容会直接覆盖之前的绘图,最终只保留最后一次的结果。
  2. Spyder自动显示机制:Spyder默认开启了「Automatic plot display」,即便你不调用plt.show(),Matplotlib也会自动弹出绘图窗口,但因为所有绘图都集中在同一个窗口,只会显示最后一次的内容。

修改后的代码

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import scipy.signal

def FancyPlot(Signal, Time, HSdt):
    # 每次调用都生成新的独立绘图窗口
    fig = plt.figure()
    gs = gridspec.GridSpec(2, 3, width_ratios=[1, 2, 0.5], height_ratios=[4, 1.5])
    
    # 基于当前窗口创建子图
    ax1 = fig.add_subplot(gs[1])                   # 对应原ax102
    ax0 = fig.add_subplot(gs[0], sharey=ax1)       # 对应原ax101
    ax2 = fig.add_subplot(gs[2])                   # 对应原ax103
    ax3 = fig.add_subplot(gs[4], sharex=ax1)       # 对应原ax104
    
    f, S = scipy.signal.welch(Signal, 1/HSdt, nperseg=4*1024)
    ax0.loglog(S, f)
    ax3.plot(Time, Signal)
    ax2.plot(Time, Signal)

# 调用示例(生成3张独立图)
for i in range(3):
    # 替换为你的测试数据
    test_signal = [x+i for x in range(100)]
    test_time = list(range(100))
    test_hsdt = 0.1
    FancyPlot(test_signal, test_time, test_hsdt)

# 统一显示所有窗口(Spyder环境下也可省略,会自动弹出)
plt.show()

关键修改点

  • 移除无用的Axis参数:原函数中ax = [Axis +101, ...]这行完全多余,后续子图对象会覆盖这些数值,直接删除即可简化函数。
  • 强制创建新窗口:每次调用函数时用fig = plt.figure()生成独立窗口,确保各次绘图互不干扰。
  • 绑定子图到当前窗口:改用fig.add_subplot()替代plt.subplot(),明确将子图关联到新创建的窗口上。
  • 调整显示时机:可在所有绘图完成后统一调用plt.show(),Spyder环境下每个新窗口也会自动弹出。

额外建议

  • 检查Spyder绘图设置:在Tools > Preferences > IPython console > Graphics中,确保Backend设置为「Automatic」或「Qt5Agg」(独立窗口模式),避免内嵌显示引发的冲突。
  • 若需手动控制窗口显示,可在函数内添加fig.show(),配合plt.pause(0.01)确保窗口正常弹出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:20:22