【问题标题】:Python plt: close or clear figure does not workPython plt:关闭或清除数字不起作用
【发布时间】:2018-02-06 14:27:06
【问题描述】:

我使用脚本生成了很多图形,这些图形不显示但存储到硬盘。过了一会儿,我收到了消息

/usr/lib/pymodules/python2.7/matplotlib/pyplot.py:412:RuntimeWarning:已经打开了20多个图。通过 pyplot 接口 (matplotlib.pyplot.figure) 创建的图形会一直保留到明确关闭,并且可能会消耗太多内存。 (要控制此警告,请参阅 rcParam figure.max_num_figures)。 max_open_warning, RuntimeWarning)

因此,我尝试在存储后关闭或清除数字。到目前为止,我尝试了以下所有方法,但没有一个有效。我仍然收到上面的消息。

plt.figure().clf()
plt.figure().clear()
plt.clf()
plt.close()
plt.close('all')
plt.close(plt.figure())

此外,我还尝试通过以下方式限制打开数字的数量

plt.rcParams.update({'figure.max_num_figures':1})

下面是一段与上述行为类似的示例代码。我在我尝试过的地方添加了我尝试过的不同选项作为 cmets。

from pandas import DataFrame
from numpy import random
df = DataFrame(random.randint(0,10,40))

import matplotlib.pyplot as plt
plt.ioff()
#plt.rcParams.update({'figure.max_num_figures':1})
for i in range(0,30):
    fig, ax = plt.subplots()
    ax.hist([df])
    plt.savefig("/home/userXYZ/Development/pic_test.png")
    #plt.figure().clf()
    #plt.figure().clear()
    #plt.clf()
    #plt.close() # results in an error
    #plt.close('all') # also error
    #plt.close(plt.figure()) # also error

完整地说,这是我在使用plt.close时遇到的错误:

无法调用“事件”命令:应用程序已被销毁 在执行“事件生成 $w ”时 (程序“ttk::ThemeChanged”第 6 行) 从“ttk::ThemeChanged”中调用

【问题讨论】:

  • 为了确保你总是在同一个图上工作,只需使用这个plt.figure(1).clf()
  • plt.close(fig) 应该这样做
  • @Julien 这也会产生 RuntimeWarning
  • @Y0da: 结果与上述相同
  • 可能duplicate。将图形的创建移出 for 循环,并在每次迭代后使用 plt.clf() 清除图形。因此,只会创建和重新填充一个图形。

标签: python python-2.7 matplotlib


【解决方案1】:

关闭您的数字的正确方法是使用plt.close(fig),您可以在下面对您最初发布的代码的编辑中看到。

from pandas import DataFrame
from numpy import random
df = DataFrame(random.randint(0,10,40))

import matplotlib.pyplot as plt
plt.ioff()
for i in range(0,30):
    fig, ax = plt.subplots()
    ax.hist(df)        
    name = 'fig'+str(i)+'.png'  # Note that the name should change dynamically
    plt.savefig(name)
    plt.close(fig)              # <-- use this line

您在问题末尾描述的错误向我表明,您的问题不在于 matplotlib,而在于您的代码的另一部分(例如 ttk)。

【讨论】:

  • 我运行了你的代码,但它也导致了 ttk 错误 - 不知道原因。而且我不想有一个情节,而是一个直方图......
  • 您可以将plt.plot(df) 行与您生成直方图的方式交换,我只是没有将您的ax.hist([df]) 修复为ax.hist(df),我现在已经在答案中修改了它。然而,你的问题是关于如何关闭这个数字,这是我关注的。
  • 'ax.hist(df)' 产生混乱 - 我没有得到条形,而只有一个实心正方形。仍然:'plt.close(fig)' 产生我没有找到任何解决方案的 'ttk' 错误。
  • @AnnetteC 那是因为matplotlib部分没有问题。您的问题是由问题中未询问/列出/显示的其他问题引起的。
【解决方案2】:

plt.show() 是一个阻塞函数,所以在上面的代码中,plt.close() 直到关闭 fig 窗口才会执行。 您可以在代码的开头使用 plt.ion() 使其成为非阻塞的。即使这有其他一些含义,无花果也会被关闭。

【讨论】:

    【解决方案3】:

    这并不能真正解决我的问题,但它是一种解决我面临的高内存消耗的解决方法,并且我没有像以前那样收到任何错误消息:

    from pandas import DataFrame
    from numpy import random
    df = DataFrame(random.randint(0,10,40))
    
    import matplotlib.pyplot as plt
    plt.ioff()
    for i in range(0,30):
        plt.close('all')
        fig, ax = plt.subplots()
        ax.hist([df])
        plt.savefig("/home/userXYZ/Development/pic_test.png")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 2014-02-28
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多