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
相关产品推荐
相关产品推荐

