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

