何时使用 cla()、clf() 或 close() 清除图形

747 投票
4 回答
1129459 浏览
提问于 2025-04-17 06:45

Matplotlib提供了这些功能:

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

我应该什么时候使用每个功能,它们具体是做什么的呢?

4 个回答

25

plt.cla() 的意思是 清空当前的坐标轴

plt.clf() 的意思是 清空当前的图形

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

想了解更多,可以点击这里:Matplotlib、Pyplot、Pylab 等等:它们之间有什么区别,什么时候使用每一个?

117

今天我发现了一个小问题。如果你有一个函数需要多次调用绘图,最好使用 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上提供了一个解决方法,见:创建一个引用计数的图形

931

这些功能各有不同,因为 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),如上所述。

撰写回答