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

如何在for循环中生成多个独立matplotlib绘图 每份Excel数据对应独立图表

问题根因

你当前的代码每次循环都会调用plt.subplots()创建独立的新图表,本身不会出现数据覆盖的问题。你观察到的「仅生成1张图」的现象是matplotlib默认的阻塞渲染机制导致的:plt.show()运行后会暂停整个程序的执行,直到你手动关闭当前弹出的图表窗口,for循环才会进入下一次迭代,生成第二个文件对应的图表。

方案1:逐个查看交互式图表

如果需要每次看完一张图,关闭后自动弹出下一张,仅需在原有代码基础上补充plt.close()主动释放内存,同时建议把图表标题设置为对应文件名,方便区分不同文件的处理结果,修改后代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import MultiCursor
import matplotlib.pylab as pl

Files_to_read = np.array([r"C:\file1",r"C:\file2"])
for ii in range(len(Files_to_read)):
    df=pd.read_excel(Files_to_read[ii])
    # do a lot of stuff to "df"
    fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,sharex=True)
    # 标题替换为当前文件名,方便区分
    fig.suptitle(f'处理结果:{Files_to_read[ii].split("\\")[-1]}')
    p1 = ax1.plot(df["some vector"], df["some vector"])
    p2 = ax2.plot(df["some vector"], df["some vector"])
    p3 = ax3.plot(df["some vector"], df["some vector"])
    p4 = ax4.plot(df["some vector"], df["some vector"])
    multi = MultiCursor(fig.canvas, (ax1, ax2, ax3, ax4), color='r', lw=1)
    plt.show()
    # 关闭当前图表,释放内存,进入下一次循环
    plt.close()

方案2:批量保存图表到本地(不弹出交互窗口)

如果不需要逐个查看交互窗口,文件数量较多时更适合直接把所有图表自动保存到本地路径,修改后代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import MultiCursor
import matplotlib.pylab as pl

# 非GUI后端,不需要弹出图形窗口
plt.switch_backend('agg')

Files_to_read = np.array([r"C:\file1",r"C:\file2"])
for ii in range(len(Files_to_read)):
    df=pd.read_excel(Files_to_read[ii])
    # do a lot of stuff to "df"
    fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,sharex=True, figsize=(10,8))
    file_name = Files_to_read[ii].split("\\")[-1]
    fig.suptitle(f'处理结果:{file_name}')
    p1 = ax1.plot(df["some vector"], df["some vector"])
    p2 = ax2.plot(df["some vector"], df["some vector"])
    p3 = ax3.plot(df["some vector"], df["some vector"])
    p4 = ax4.plot(df["some vector"], df["some vector"])
    multi = MultiCursor(fig.canvas, (ax1, ax2, ax3, ax4), color='r', lw=1)
    # 保存到本地,可自定义路径和格式(png/jpg/pdf等)
    plt.savefig(f'./{file_name}_处理结果.png', dpi=300, bbox_inches='tight')
    # 关闭当前图表,释放内存
    plt.close()

补充:同时弹出所有图表窗口

如果需要一次性弹出所有文件的图表窗口,无需关闭上一张再加载下一张,可以将plt.show()移到for循环外部,同时开启交互模式:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import MultiCursor
import matplotlib.pylab as pl

# 开启交互模式
plt.ion()
Files_to_read = np.array([r"C:\file1",r"C:\file2"])
for ii in range(len(Files_to_read)):
    df=pd.read_excel(Files_to_read[ii])
    # do a lot of stuff to "df"
    fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,sharex=True)
    fig.suptitle(f'处理结果:{Files_to_read[ii].split("\\")[-1]}')
    p1 = ax1.plot(df["some vector"], df["some vector"])
    p2 = ax2.plot(df["some vector"], df["some vector"])
    p3 = ax3.plot(df["some vector"], df["some vector"])
    p4 = ax4.plot(df["some vector"], df["some vector"])
    multi = MultiCursor(fig.canvas, (ax1, ax2, ax3, ax4), color='r', lw=1)
    plt.draw()
    plt.pause(0.1)

# 关闭交互模式,所有窗口保持显示直到手动关闭
plt.ioff()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:06:00