When to use cla(), clf() or close() for clearing a plot in matplotlib?
Matplotlib提供以下功能:
1 2 3
| cla() # Clear axis
clf() # Clear figure
close() # Close a figure window |
文档并没有提供很多关于这些函数之间的区别的洞察。我应该什么时候使用每个函数,它具体做什么?
它们都会做不同的事情,因为matplotlib使用一个分层的顺序,其中一个图形窗口包含一个可能由多个轴组成的图形。此外,Pyplot接口中还有函数,Figure类中也有方法。我将在下面讨论这两个案例。
Pyplot接口
pyplot是一个模块,它收集一些功能,允许Matplotlib以功能方式使用。我这里假设pyplot作为import matplotlib.pyplot as plt进口。在这种情况下,有三种不同的命令可以删除内容:
plt.cla()清除一个轴,即当前图形中当前活动的轴。它使其他轴保持原样。
plt.clf()用其所有轴清除整个当前图形,但使窗口保持打开状态,以便可以将其重新用于其他绘图。
plt.close()关闭一个窗口,如果没有另外指定,该窗口将是当前窗口。
因此,哪些功能最适合您,取决于您的用例。
close()函数还允许指定应关闭哪个窗口。参数可以是使用figure(number_or_name)创建窗口时给窗口指定的数字或名称,也可以是获得的fig图形实例,即usingfig = figure()。如果没有给close()参数,当前活动窗口将关闭。此外,还有语法close('all'),它关闭所有数字。
Figure类的方法
此外,Figure类提供了清除数字的方法。我将在下面假设fig是Figure的一个实例:
fig.clf()清除了整个数字。只有当fig是当前数字时,此调用才等价于plt.clf()。
fig.clear()是fig.clf()的同义词。
注意,即使是del fig也不会关闭相关的图形窗口。据我所知,关闭图形窗口的唯一方法是使用上面描述的plt.close(fig)。
- 谢谢大卫的解释。Matplotlib文档中的一些额外的句子会有很长的路要走!
- 因为close()是一个非特定的命令,所以我寻找一种方法来指定图形闭包(fig.close()不是一个函数)。正确的语法是:plt.close(fig)。
- 说得对。我在答案中添加了更多细节。
- 至于clear(),我没有看到与cla()有太大的区别,只是在寄生轴上,只有cla()是专门处理的。
- 我的matplotlib.pyplot中没有clear()功能(MacOS上的版本1.4.2)。你能告诉我相关文件吗?
- figure和axis类都有一个clear()方法。Figure.clear相当于clf和Axes.clear相当于cla。
- 只是对正确性的简短评论。使用"import matplotlib.pyplot"导入的内容不是pylab。那是Pyplot。派拉伯是另一回事。matplotlib.org/faq/…
- @拉蒙马丁内斯:你说得对——我把派拉伯和派普洛特搞混了。我相应地修改了课文。
- 这对Jupyter有效吗?我不断犯内存错误,因为当我在Jupyter中重新运行一个单元时,数据不会被垃圾收集。
我今天发现了一个警告。如果有一个函数经常调用一个图,那么最好使用plt.close(fig),而不是fig.clf(),因为第一个函数不会在内存中累积。简而言之,如果记忆是一个问题,请使用plt.close(图)(尽管似乎有更好的方法,但请转到此注释的末尾获取相关链接)。
因此,下面的脚本将生成一个空列表:
1 2 3 4 5
| for i in range(5):
fig = plot_figure()
plt.close(fig)
# This returns a list with all figure numbers available
print(plt.get_fignums()) |
然而,这一个会产生一个列表,上面有五个数字。
1 2 3 4 5
| for i in range(5):
fig = plot_figure()
fig.clf()
# This returns a list with all figure numbers available
print(plt.get_fignums()) |
号
根据上面的文档,我不清楚关闭图形和关闭窗口之间的区别。也许这能解释清楚。
如果您想在那里尝试一个完整的脚本,您可以:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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()) |
如果记忆是一个问题,某人已经在其中发布了一个工作,那么请参见:创建引用计数的图形
- 感谢您对参考计数问题的有用交叉引用。这正是Matplotlib应该如何工作的。同样令人恐惧和震惊的是,根据标准pyplotapi,这些数字从不被垃圾收集。
- 不过,我发现,如果要制作动画(例如一些二维轮廓/pcolormesh地图),最好清除图形并绘制新字段,而不是关闭旧图形面板和制作新图形面板。速度将完全不同。
plt.cla()表示清除当前轴
plt.clf()表示清除当前数字
还有plt.gca()(获取当前轴)和plt.gcf()(获取当前数字)
在这里阅读更多:matplotlib、pyplot、pylab等:它们和何时使用它们有什么区别?