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

sou*_*hoz 492 plot matplotlib

Matplotlib提供以下功能:

cla()   # Clear axis
clf()   # Clear figure
close() # Close a figure window
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ker 646

它们都做不同的事情,因为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课程还提供了清算数字的方法.我假设在下面fig是一个实例Figure:

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

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

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

  • 因为`close()`是一个非特定的命令,我去寻找一种指定数字闭包的方法(`fig.close()`不是函数).正确的语法是:`plt.close(fig)`. (34认同)
  • 这对 jupyter 有效吗?我一直遇到内存错误,因为当我在 jupyter 中重新运行一个单元格时,数字没有被垃圾收集。 (3认同)
  • Figure 和 Axes 类都有一个 `clear()` 方法。[`Figure.clear`](http://matplotlib.org/api/figure_api.html?highlight=clear#matplotlib.figure.Figure.clear) 等价于 `clf` 和 [`Axes.clear`](http ://matplotlib.org/api/axes_api.html?highlight=clear#matplotlib.axes.Axes.clear) 等价于 `cla`。 (2认同)

Ram*_*nez 70

我今天发现了一个警告.如果你有一个多次调用绘图的函数,你最好使用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())
Run Code Online (Sandbox Code Playgroud)

而这个将产生一个包含五个数字的列表.

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

从上面的文档中我不清楚关闭一个数字和关闭一个窗口有什么区别.也许这会澄清.

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

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())
Run Code Online (Sandbox Code Playgroud)

如果记忆是一个问题,有人已经在SO中发布了一个解决方案,请参阅: 创建一个被引用计算的数字

  • 感谢您对引用计数问题的有用交叉引用.**这就是Matplotlib _should_已经正常工作的方式.**同样可怕的是,令人震惊的是,数字永远不会在标准的'pyplot` API下进行垃圾收集. (26认同)
  • 尽管如此,我发现如果必须制作动画(例如某些 2D 轮廓/pcolormesh 贴图),最好清除图形并绘制新字段,而不是关闭旧图形面板并制作新图形面板。速度会完全不同。 (2认同)

Fel*_*ida 9

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

plt.clf()表示清除当前数字

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

在此处阅读更多信息:Matplotlib,Pyplot,Pylab等:这些以及何时使用它们有什么区别?