Python plt:close或clear figure不起作用

7 浏览
0 Comments

Python plt:close或clear figure不起作用

我用一个脚本生成了很多图形,但是并没有显示,而是存储到硬盘中。过了一段时间后,我收到了以下消息:\n

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

\n因此,我尝试在存储后关闭或清除这些图形。到目前为止,我尝试了下面的所有方法,但都没有成功。我仍然收到上面的消息。\n

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

\n而且,我还尝试通过以下方式限制打开图形的数量:\n

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

\n以下是一个像上面描述的代码示例。我在我尝试的地方用注释添加了不同的选项。\n

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() # 导致错误
    #plt.close('all') # 也是错误
    #plt.close(plt.figure()) # 也是错误

\n为了完整起见,以下是当使用plt.close时出现的错误:\n

\ncan\'t invoke \"event\" command: application has been destroyed\n while executing \"event generate $w <>\"\n (procedure \"ttk::ThemeChanged\" line 6)\n invoked from within \"ttk::ThemeChanged\"\n

0
0 Comments

问题原因:plt.show()是一个阻塞函数,因此在上面的代码中,plt.close()将不会执行,直到fig窗口关闭。

解决方法:在代码开头使用plt.ion()使其变为非阻塞。尽管这会带来其他一些影响,但是fig将被关闭。

以下是整理后的文章:

在使用Python的matplotlib库中,有时候我们可能会遇到这样的问题:无法通过plt.close()或plt.clf()来关闭或清除图形。那么为什么会出现这个问题,以及如何解决呢?

问题的原因是plt.show()函数是一个阻塞函数。也就是说,在调用plt.show()之后,后面的代码将无法立即执行,直到我们手动关闭图形窗口。因此,当我们使用plt.close()或plt.clf()来关闭或清除图形时,这些函数将无法立即执行。

要解决这个问题,我们可以在代码开头加上plt.ion()。plt.ion()是指交互模式,它可以使得plt.show()变为非阻塞模式。虽然这样做会对代码产生一些影响,但是我们可以确保图形窗口能够被关闭。

下面是一个示例代码:

import matplotlib.pyplot as plt
# 开启交互模式
plt.ion()
# 绘制图形
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
# 显示图形
plt.show()
# 关闭图形
plt.close()

在这个示例代码中,我们首先通过plt.ion()开启了交互模式。然后,我们绘制了一个简单的曲线图,并调用了plt.show()来显示图形。最后,我们使用plt.close()来关闭图形。

通过这样的操作,我们可以确保图形能够被正确地关闭。当然,值得注意的是,使用交互模式可能会对代码的其他部分产生一些影响。因此,在实际使用中需要根据具体情况来决定是否使用交互模式。

总结起来,当我们遇到无法通过plt.close()或plt.clf()来关闭或清除图形的问题时,可以尝试使用plt.ion()来开启交互模式,以确保图形能够被正确地关闭。

0
0 Comments

这段代码中出现了一个问题,即无法通过plt.close或plt.clf关闭或清除图形。原因是在循环中使用了plt.savefig,这会导致图形一直保留在内存中,无法被关闭或清除。

要解决这个问题,可以在每次循环之后调用plt.close或plt.clf来关闭或清除图形。修改后的代码如下:

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")
    plt.close() # 在每次循环之后关闭图形

通过在每次循环结束时调用plt.close(),可以关闭之前创建的图形,从而避免内存消耗过高的问题。这样就可以实现在循环中创建新的图形,并在每次循环结束时将旧的图形关闭。

希望这个解决方法能帮助到你解决问题!

0
0 Comments

问题出现的原因:问题出现的原因可能是在代码的其他部分(如ttk)中,而不是matplotlib部分。

解决方法:使用plt.close(fig)来正确关闭图形。

0