重复调用含gridspec的绘图函数仅显示最后一张图的求助
问题解决:重复调用FancyPlot仅显示最后一张图
问题根源
- 未创建独立绘图窗口:你的函数每次调用时,都会在Matplotlib的全局默认绘图窗口(Figure)上绘制子图,后续调用的内容会直接覆盖之前的绘图,最终只保留最后一次的结果。
- 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
相关产品推荐
相关产品推荐

