Python plt:close或clear figure不起作用
Python plt:close或clear figure不起作用
我用一个脚本生成了很多图形,但是并没有显示,而是存储到硬盘中。过了一段时间后,我收到了以下消息:\n
\n/usr/lib/pymodules/python2.7/matplotlib/pyplot.py:412: RuntimeWarning: 已经打开了超过20个图形。通过pyplot接口(
matplotlib.pyplot.figure
)创建的图形将一直保留,直到显式关闭,并且可能占用过多的内存。(要控制此警告,请参阅rcParamfigure.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
问题原因: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()来开启交互模式,以确保图形能够被正确地关闭。
这段代码中出现了一个问题,即无法通过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(),可以关闭之前创建的图形,从而避免内存消耗过高的问题。这样就可以实现在循环中创建新的图形,并在每次循环结束时将旧的图形关闭。
希望这个解决方法能帮助到你解决问题!