Python plt:close或clear figure不起作用

时间:2017-08-29 08:09:31

标签: python python-2.7 matplotlib

我生成了很多带有脚本的数字,我没有显示但存储到硬盘。过了一会儿,我收到了消息

  

/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})

下面是一段示例代码,其行为如上所述。我在我尝试过的地方添加了我尝试作为评论的不同选项。

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时遇到的错误:

  

无法调用“event”命令:应用程序已被破坏       执行“event generate $ w<>”时       (程序“ttk :: ThemeChanged”第6行)       从“ttk :: ThemeChanged”

中调用

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

plt.show()是一个阻止函数,因此在上面的代码中,plt.close()在关闭无花果窗口之前不会执行。 您可以在代码的开头使用plt.ion()使其无阻塞。即使这有其他含义,无花果也将关闭。

答案 2 :(得分:-1)

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

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")