我生成了许多用脚本的数字,我不显示这些脚本,而是存储到硬盘驱动器。一段时间后,我收到消息
/usr/lib/pymodules/python2.7/matplotlib/pyplot.py:412:RuntimeWarning:已打开了20多个数字。保留通过Pyplot接口(
matplotlib.pyplot.figure
)创建的数字,直到明确关闭并可能消耗过多的内存为止。(要控制此警告,请参见RCPARAMfigure.max_num_figures
)。 max_open_warning,runtime warnning)
因此,我试图在存储后关闭或清除数字。到目前为止,我尝试了所有以下内容,但没人能做。我仍然从上面收到消息。
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
时遇到的错误:
无法调用"事件"命令:应用程序已被销毁 执行"事件生成$ w<>"时 (程序" TTK :: themechanged"第6行) 从" ttk :: themechanged"中调用
关闭数字的正确方法是使用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
)。
这并不能真正解决我的问题,但是要处理我面对的高内存消耗,并且我没有像以前一样收到任何错误消息:
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.show()是一个阻止函数,因此在上述代码中,plt.close()将直到无花果窗口关闭后才能执行。您可以在代码开始时使用plt.ion()使其无障碍物。即使这具有其他含义,无花果也将关闭。
i在Python 3.9.7,Matplotlib 3.5.1和VS代码上仍然存在相同的问题(plt.close()
没有组合的问题关闭了图)。我有三个循环,最内部循环绘制了20个以上的数字。对我有用的解决方案是在plt.close(someFig)
之后使用agg
作为后端和del someFig
。随后,代码顺序将是:
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt
someFig = plt.figure()
.
.
.
someFig.savefig('OUTPUT_PATH')
plt.close(someFig) # --> (Note 1)
del someFig
.
.
.
- 注1:如果删除了此行,则可能无法正确绘制输出数字!尤其是当图中要渲染的元素数量很高时。
- 注2:我不知道该解决方案是否可以适得其反,但至少它在工作,不拥抱RAM或阻止绘制图形!