何时使用 cla()、clf() 或 close() 清除图形
Matplotlib提供了这些功能:
cla() # Clear axis
clf() # Clear figure
close() # Close a figure window
我应该什么时候使用每个功能,它们具体是做什么的呢?
4 个回答
plt.cla() 的意思是 清空当前的坐标轴
plt.clf() 的意思是 清空当前的图形
另外,还有 plt.gca()(获取当前坐标轴)和 plt.gcf()(获取当前图形)
想了解更多,可以点击这里:Matplotlib、Pyplot、Pylab 等等:它们之间有什么区别,什么时候使用每一个?
今天我发现了一个小问题。如果你有一个函数需要多次调用绘图,最好使用 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())
如果你担心内存问题,有人已经在StackOverflow上提供了一个解决方法,见:创建一个引用计数的图形
这些功能各有不同,因为 matplotlib 使用了一种层级结构,其中一个图形窗口包含一个图形,而这个图形可能由多个坐标轴组成。此外,还有一些来自 pyplot 接口的函数,以及 Figure
类的方法。下面我会分别讲讲这两种情况。
pyplot 接口
pyplot
是一个模块,里面收集了一些函数,可以让我们以一种功能性的方式使用 matplotlib。我假设你已经用 import matplotlib.pyplot as plt
导入了 pyplot
。在这种情况下,有三个不同的命令可以用来清除内容:
可以查看 matplotlib.pyplot
的函数:
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()
的同义词。
需要注意的是,即使使用 del fig
也不会关闭相关的图形窗口。据我所知,关闭图形窗口的唯一方法是使用 plt.close(fig)
,如上所述。