何时使用cla(),clf()或close()清除matplotlib中的图?

时间:2011-11-21 14:38:03

标签: matplotlib plot

Matplotlib提供了以下功能:

cla()   # Clear axis
clf()   # Clear figure
close() # Close a figure window

文档没有提供很多关于这些功能之间区别的见解。我什么时候应该使用每个功能以及它究竟做了什么?

3 个答案:

答案 0 :(得分:574)

它们都做不同的事情,因为matplotlib使用层次结构顺序,其中图形窗口包含可能由许多轴组成的图形。此外,pyplot接口还有一些函数,Figure类上有方法。我将在下面讨论这两种情况。

pyplot接口

pyplot是一个模块,它收集了一些允许matplotlib以功能方式使用的函数。我在此假设pyplot已导入为import matplotlib.pyplot as plt。 在这种情况下,有三个不同的命令可以删除内容:

plt.cla() clears an axes,即当前图中当前活动的轴。它使其他轴保持不变。

plt.clf() clears the entire current figure及其所有轴,但保持窗口打开,以便可以重复用于其他绘图。

plt.close() closes a window,如果没有另外指定,它将是当前窗口。

最适合您的功能取决于您的使用情况。

close()函数还允许指定应关闭哪个窗口。参数可以是使用figure(number_or_name)创建时为窗口指定的数字或名称,也可以是获得的数字实例fig,即使用fig = figure()。如果没有给close()赋予参数,则将关闭当前活动的窗口。此外,还有语法close('all'),它会关闭所有数字。

图类的

方法

此外,Figure类提供清除数字的方法。 我将在下面假设figFigure的实例:

fig.clf() clears the entire figure。仅当plt.clf()是当前数字时,此调用才相当于fig

fig.clear()fig.clf()

的同义词

请注意,即使del fig也不会关闭关联的数字窗口。据我所知,关闭图形窗口的唯一方法是使用plt.close(fig),如上所述。

答案 1 :(得分:63)

我今天发现了一个警告。 如果你有一个多次调用绘图的函数,你最好使用plt.close(fig)而不是fig.clf(),不管怎样,第一个函数不会在内存中累积。简而言之如果内存是一个问题,请使用plt.close(图)(虽然看起来有更好的方法,但请查看相关链接的评论结尾)。

因此以下脚本将生成一个空列表:

for i in range(5):
    fig = plot_figure()
    plt.close(fig)
# This returns a list with all figure numbers available
print(plt.get_fignums())

虽然这个会产生一个包含五个数字的列表。

for i in range(5):
    fig = plot_figure()
    fig.clf()
# This returns a list with all figure numbers available
print(plt.get_fignums())

从上面的文档中我不清楚关闭图形和关闭窗口有什么区别。也许这会澄清。

如果你想尝试一个完整的脚本,你有:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1000)
y = np.sin(x)

for i in range(5):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y)
    plt.close(fig)

print(plt.get_fignums())

for i in range(5):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y)
    fig.clf()

print(plt.get_fignums())

如果记忆是一个问题,有人已经在SO中发布了解决方案,请参阅: Create a figure that is reference counted

答案 2 :(得分:6)

plt.cla()表示清除当前轴

plt.clf()表示清除当前图形

此外,还有 plt.gca()(获取当前轴)和 plt.gcf()(获取当前图形)

在此处了解更多信息:Matplotlib, Pyplot, Pylab etc: What's the difference between these and when to use each?