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

matplotlib循环保存FFT结果图时前序曲线重叠问题如何修复

问题描述

我在使用matplotlib保存图片时遇到了问题。我编写的代码会对信号做FFT处理,处理完成后需要将每一次的FFT结果单独保存为.png格式的文件。目前运行时第一张生成的图片正常,但后续所有图片都叠加了之前所有的FFT曲线,请问该如何修复?

复现代码
import numpy as np
import matplotlib.pyplot as plt
import glob

txt_files = glob.glob("*.pom") # 读取所有.pom后缀的文件
print(txt_files)


for i in range(len(txt_files)):

    mat = np.genfromtxt(txt_files[i])
    a = np.delete(mat, 0, axis=1)
    b = mat[1, 0] - mat[0, 0]

    std = a.std()
    mean = a.mean()

    print(std, mean)

    Fs = 5000  # 采样频率,第一列为时间时使用该值
    tstep = 1 / Fs  # 采样时间间隔

    N = np.size(a)  # 采样点数量

    t = np.linspace(0, (N - 1) * tstep, N)  # 时间序列
    fstep = Fs / N
    f = np.linspace(0, (N - 1) * fstep, N)  # 频率序列

    X = np.fft.fft2(a)
    X_mag = np.abs(X) / N

    f_plot = f[0:int(N / 2 + 1)]

    X_mag_plot = 2 * X_mag[0:int(N / 2 + 1)]
    X_mag_plot[0] = X_mag_plot[0] / 2

    plt.plot(f_plot, X_mag_plot, "-k", linewidth=0.5)
    plt.xlabel('Frequency [Hz]')
    plt.ylabel('Amplitude')
    plt.xscale("log")
    plt.axis([1, 1000, 0, 0.01])
    plt.grid(True)
    plt.text(300, 0.01, f'std={std:.3f} \nmean={mean:.3f}', backgroundcolor="w")

    np.savetxt(txt_files[i] + "_Widmo.txt", X_mag_plot, delimiter="\t")
    plt.savefig(txt_files[i] + ".png", dpi=250)
    if i == 1:
        np.savetxt(txt_files[0] + "_Fs.txt", f_plot, delimiter="\t")
    del f_plot
    del X_mag_plot
    del txt_files[i]
解决方案

曲线叠加的核心原因是matplotlib的plt接口默认会复用当前活动画布,每次调用plt.plot都会在现有画布上追加绘制,不会自动清空之前的内容。你可以选择以下任意一种方式修复:

  • 方式1(最简单,适配现有代码):在每次循环保存图片后清空当前画布,添加plt.clf()语句即可,位置放在plt.savefig之后即可。
  • 方式2(每次创建新画布,避免互相干扰):在每次循环开始绘图前添加plt.figure()创建新画布,保存后加plt.close()释放内存,避免循环次数过多导致内存占用过高。
  • 方式3(更规范的面向对象写法):显式创建画布和轴对象,用完主动关闭:
# 循环内绘图部分修改为
fig, ax = plt.subplots()
ax.plot(f_plot, X_mag_plot, "-k", linewidth=0.5)
ax.set_xlabel('Frequency [Hz]')
ax.set_ylabel('Amplitude')
ax.set_xscale("log")
ax.axis([1, 1000, 0, 0.01])
ax.grid(True)
ax.text(300, 0.01, f'std={std:.3f} \nmean={mean:.3f}', backgroundcolor="w")
fig.savefig(txt_files[i] + ".png", dpi=250)
plt.close(fig)

另外注意你现有代码中循环内del txt_files[i]的写法是错误的,遍历列表过程中删除元素会导致列表长度动态缩短,后续循环会出现索引越界报错,建议直接删除这行代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:36:02