何时使用 cla()、clf() 或 close() 清除 matplotlib 中的绘图?
Posted
技术标签:
【中文标题】何时使用 cla()、clf() 或 close() 清除 matplotlib 中的绘图?【英文标题】:When to use cla(), clf() or close() for clearing a plot in matplotlib? 【发布时间】:2012-01-03 01:16:10 【问题描述】:Matplotlib 提供以下功能:
cla() # Clear axis
clf() # Clear figure
close() # Close a figure window
文档没有提供很多关于这些函数之间区别的见解。我应该在什么时候使用每个功能,它的具体作用是什么?
【问题讨论】:
【参考方案1】:它们都做不同的事情,因为 matplotlib 使用分层顺序,其中图形窗口包含一个可能由许多轴组成的图形。此外,还有来自 pyplot 接口的函数和 Figure
类的方法。我将在下面讨论这两种情况。
pyplot 界面
pyplot
是一个模块,它收集了几个允许 matplotlib 以函数方式使用的函数。我在这里假设pyplot
已被导入为import matplotlib.pyplot as plt
。
在这种情况下,有三个不同的命令可以删除内容:
见matplotlib.pyplot
函数:
plt.cla()
clears an axes,即当前图形中当前活动的轴。它使其他轴保持不变。
plt.clf()
clears the entire current figure 及其所有坐标轴,但保持窗口打开,以便可以将其重新用于其他绘图。
plt.close()
closes a window,如果没有另外指定,将是当前窗口。
因此,哪种功能最适合您取决于您的用例。
close()
函数还允许指定应关闭哪个窗口。参数可以是使用figure(number_or_name)
创建窗口时赋予窗口的数字或名称,也可以是使用fig = figure()
获得的图形实例fig
。如果close()
没有参数,当前活动的窗口将被关闭。此外,还有 close('all')
语法,它关闭所有图形。
Figure类的方法
此外,Figure
类提供了清除数字的方法。
我将在下面假设fig
是Figure
的一个实例:
fig.clf()
clears the entire figure。仅当 fig
是当前数字时,此调用才等效于 plt.clf()
。
fig.clear()
是 fig.clf()
的同义词
请注意,即使del fig
也不会关闭关联的图形窗口。据我所知,关闭图形窗口的唯一方法是使用plt.close(fig)
,如上所述。
【讨论】:
【参考方案2】:我今天发现了一个警告。
如果您有一个多次调用绘图的函数,您最好使用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 中发布了解决方法,请参阅: Create a figure that is reference counted
【讨论】:
感谢您对引用计数问题的有用交叉引用。 这正是 Matplotlib应该已经工作的方式。同样可怕和骇人听闻的是,在标准pyplot
API 下,数字永远不会被垃圾收集。
尽管如此,我发现如果必须制作动画(例如一些 2D 轮廓/pcolormesh 地图),最好清除图形并绘制新字段,而不是关闭旧图形面板并制作新图形面板.速度会完全不同。【参考方案3】:
plt.cla() 表示清除当前轴
plt.clf() 表示清除当前图形
还有plt.gca()(获取当前坐标轴)和plt.gcf()(获取当前图形)
在此处阅读更多信息:Matplotlib, Pyplot, Pylab etc: What's the difference between these and when to use each?
【讨论】:
以上是关于何时使用 cla()、clf() 或 close() 清除 matplotlib 中的绘图?的主要内容,如果未能解决你的问题,请参考以下文章