【问题标题】:How to make pyplot.close() work properly in python?如何使 pyplot.close() 在 python 中正常工作?
【发布时间】:2021-01-19 01:15:07
【问题描述】:

我想创作很多,至少10000个情节, 所以我用for循环来做,这是我的代码。

for i in range(0, 10000):
    fig, ax = plt.subplots(1, 1, num=0)
    x = np.linspace(0, 100, 100)
    y = np.sin(x)
    
    ax.plot(x, y)
    plt.tight_layout()
    fig.savefig("test.png")
    plt.close(fig=0)
    
def plot_test():
    for i in range(0, 10000):
        fig, ax = plt.subplots(1, 1, num=0)
        x = np.linspace(0, 100, 100)
        y = np.sin(x)
        
        ax.plot(x, y)
        plt.tight_layout()
        fig.savefig("test.png")
        plt.close(fig=0)

无论在函数内部还是外部使用 plt.close(), 内存还在增加, 我检查了 plt.close("all") 和 plt.close(fig) 也没有工作。 希望有人能告诉我如何正确使用 plt.close()。

【问题讨论】:

  • 谢谢,但是那个帖子里的方法对我不起作用。
  • 我尝试了几种方法后发现内存增加可能是由于我在spyder IDE中运行代码,当我在系统终端中运行时,内存没有明显增加,即使我创建每个循环中都有新的fig

标签: python matplotlib


【解决方案1】:

所以我相信plt.close() 工作正常。您的问题是每个情节都具有相同的名称。这将覆盖目录中的任何现有文件。本质上,它创建test.png 并在每次迭代时立即覆盖它。此解决方案将i 添加到绘图名称的末尾,并保存到我创建的名为test 的目录中。有了这么多的地块,完成迭代需要一点时间

import numpy as np
import matplotlib
# The default backend is "tkinter" which is used for displaying the graphs. 
# "agg" is more lightweight and avoids a tkinter error when making lots of plots
matplotlib.use('agg')
import matplotlib.pyplot as plt
import gc



for i in range(0, 10000):
    # This just shows the progress of the loop
    print(i)
   
    fig, ax = plt.subplots(1, 1, num=0)
    x = np.linspace(0, 100, 100)
    y = np.sin(x)

    ax.plot(x, y)
    plt.tight_layout()
    fig.savefig("test/test{}.png".format(str(i)))
    plt.close(fig=fig)
    gc.collect()

【讨论】:

  • 感谢您的回复,但这并不能解决问题。这里的问题是创建了无花果,但 plt.close() 没有关闭它,因此在每次迭代中,都会再次创建一个新的无花果,内存被无花果占用,我试图在循环外创建无花果,并且在每个循环中,使用 plt.cla() 清除 ax,它对我有用,但是,有一条错误消息: UserWarning: Tight layout not applied。下边距和上边距不能足够大以容纳所有轴装饰。
  • 您确定fig 正在占用该内存吗? python 垃圾收集器在每次迭代时都会摆脱它。 plt.close 不会影响此行为。 stackoverflow.com/questions/36729249/…
  • 我不确定 fig 或其他东西是否占用内存,但是当我使用你的代码运行时,没有任何改变,内存仍在增加,但是当我将 fig 放在循环之外时,内存不会增加,因此,我的观点是 fig 占用了内存。你试过你的代码吗?
  • 最后尝试使用gc.collect()。我会为你更新我的代码。就我个人而言,我认为这两种实现都没有显着增加内存。
  • 感谢您的回复,但是我发现gc 不适合我。到目前为止,将fig 放在循环之外可能对我来说是一个临时解决方案。
猜你喜欢
  • 2020-11-07
  • 2017-08-13
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多