使用for循环保存多幅Matplotlib绘图时文件被覆盖,求解决方法
解决Matplotlib循环绘图保存时文件被覆盖的问题
你的问题根源很明确:每次循环都把变量y重新初始化为1,所以不管循环多少次,保存的文件名都是plot1.png,自然会一直覆盖第一个文件。下面给你两种简单的修复方案,顺便还帮你修正了代码里的一个小语法错误~
方案1:把y的初始化移到循环外面
把y = 1放在循环开始之前,这样每次迭代y都会递增,不会被重置:
y = 1 for name in names: DDT = dfs[dfs['Name'] == name] plt.figure(figsize=(15,7)) plt.plot(DDT['Time'], DDT['Low'], label='Low') plt.plot(DDT['Time'], DDT['Heigh'], label='Heigh') # 修正了原代码里Heigh后面多余的右括号 plt.plot(DDT['Time'], DDT['Average'], label='AVG') plt.title(name) plt.legend() plt.savefig(f"plot{y}.png") # 用f-string比format更简洁直观 y += 1 plt.close()
方案2:用enumerate自动生成索引(更Pythonic)
不需要手动维护y变量,直接用enumerate获取循环的索引,还可以指定起始值为1,完美匹配你想要的plot1.png、plot2.png命名规则:
for idx, name in enumerate(names, start=1): # start=1让索引从1开始,而不是默认的0 DDT = dfs[dfs['Name'] == name] plt.figure(figsize=(15,7)) plt.plot(DDT['Time'], DDT['Low'], label='Low') plt.plot(DDT['Time'], DDT['Heigh'], label='Heigh') plt.plot(DDT['Time'], DDT['Average'], label='AVG') plt.title(name) plt.legend() plt.savefig(f"plot{idx}.png") plt.close()
另外注意原代码里的Heigh)有个多余的右括号,已经在上面的代码里修正了,不然运行时会抛出KeyError,找不到这个列名。
内容的提问来源于stack exchange,提问作者Ison
相关产品推荐
相关产品推荐

