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


540

Matplotlib提供以下功能:

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

该文档没有提供很多关于这些功能之间的区别的见解。什么时候应该使用每个函数,它的作用是什么?

Answers:


713

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

pyplot界面

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

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

plt.clf()清除所有轴的整个当前图形,但是将窗口保持打开状态,以便可以将其重新用于其他绘图。

plt.close() 关闭一个窗口,如果没有另外指定,它将是当前窗口。

因此,哪种功能最适合您取决于您​​的用例。

close()功能还允许您指定应关闭哪个窗口。参数可以是使用创建窗口时指定给窗口的数字或名称,figure(number_or_name)也可以是使用fig获得的图形实例fig = figure()。如果未提供任何参数close(),则将关闭当前活动的窗口。此外,还有语法close('all'),它关闭了所有图形。

Figure类的方法

此外,Figure该类还提供清除图形的方法。我将在下面假设这fig是一个实例Figure

fig.clf()清除整个数字。此调用等效于plt.clf()fig是目前的数字。

fig.clear() 是的同义词 fig.clf()

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


38
因为close()是非特定命令,所以我一直在寻找一种指定图形闭合的方法(fig.close()不是函数)。正确的语法是:plt.close(fig)
tyleha

怎么样clear(),我cla()只看到寄生虫轴与仅在寄生轴上没有太大的区别cla()
破旧的2014年

1
clear()我的机器matplotlib.pyplot(MacOS上的1.​​4.2版)没有任何功能。您能指导我阅读相关文档吗?
David Zwicker 2014年

2
Figure和Axes类都有一个clear()方法。该Figure.clear等同于clfAxes.clear等价于cla
SiggyF

2
这对jupyter有用吗?我不断遇到内存错误,因为当我在jupyter中重新运行单元格时,没有收集垃圾数据。
CMCDragonkai'3

79

我今天发现了一个警告。如果您有一个函数多次调用绘图,则最好使用该函数,plt.close(fig)而不要使用fig.clf()第一个函数不会在内存中累积的函数。简而言之,如果需要考虑内存问题,请使用plt.close(fig)(尽管似乎有更好的方法,有关相关链接,请转到此注释的结尾)。

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

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中发布了解决方法,请参见: 创建一个引用计数的图形


26
感谢您对参考计数问题的有用交叉参考。这正是Matplotlib 应该已经工作的方式。同样令人震惊和震惊的是,这些数字绝不会在标准pyplotAPI 下进行垃圾收集。
Cecil Curry

1
但是,我发现如果必须制作动画(例如某些2D轮廓/ pcolormesh贴图),则最好清除图形并绘制新字段,而不是关闭旧图形并制作新图形面板。速度将完全不同。
msi_gerva

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.