Python循环迭代后如何清空列表避免matplotlib绘图数据叠加
问题根源
你清空x、y列表的操作无法解决问题,因为matplotlib的pyplot模块采用状态机设计,之前调用plt.plot()绘制的折线已经被保存在全局绘图状态中,和后续是否清空存储输入数据的x、y变量没有关联。
解决方案
有两种常用的修复方式:
- 方式1:每次保存图片后清空当前画布
只需要在plt.savefig()执行完成后,调用plt.clf()清空当前画布的所有内容即可,不需要修改其他逻辑。同时建议你把输入的字符串格式的x、y值转换为数值类型,否则绘图时会按分类字符串处理,坐标顺序和比例可能不符合预期。 - 方式2:每次循环独立创建画布对象
避免使用pyplot的全局状态,每次循环都显式创建新的画布和轴对象,从根源上避免数据叠加。
修改后代码示例(方式1,改动最小)
import matplotlib as mpl import matplotlib.pyplot as plt import os xyz = int(input("请问你要生成多少张图表? ")) n=1 for i in range(xyz): x = input("输入x轴数值,从小到大排列,用空格分隔每个数: ") # 转换为浮点型数值列表 x = list(map(float, x.split())) print(x) y = input("输入y轴数值,从小到大排列,用空格分隔每个数: ") y = list(map(float, y.split())) plt.plot(x,y) plt.savefig("Desktop/python/graph"+str(n)+".png") # 清空当前画布内容,避免下一轮叠加 plt.clf() n=n+1
修改后代码示例(方式2,更稳定)
import matplotlib as mpl import matplotlib.pyplot as plt import os xyz = int(input("请问你要生成多少张图表? ")) n=1 for i in range(xyz): x = input("输入x轴数值,从小到大排列,用空格分隔每个数: ") x = list(map(float, x.split())) print(x) y = input("输入y轴数值,从小到大排列,用空格分隔每个数: ") y = list(map(float, y.split())) # 每次循环独立创建新画布 fig, ax = plt.subplots() ax.plot(x,y) fig.savefig("Desktop/python/graph"+str(n)+".png") # 主动关闭画布释放内存资源 plt.close(fig) n=n+1
内容的提问来源于stack exchange,提问作者tf_123
相关产品推荐
相关产品推荐

