ChatGPT解决这个技术问题 Extra ChatGPT

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

Matplotlib 提供以下功能:

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

我应该什么时候使用每个功能,它到底是做什么的?


M
Mateen Ulhaq

它们都做不同的事情,因为 matplotlib 使用分层顺序,其中图形窗口包含一个可能由许多轴组成的图形。此外,还有来自 pyplot 接口的函数和 Figure 类的方法。我将在下面讨论这两种情况。

pyplot 接口

pyplot 是一个模块,它收集了一些允许以函数方式使用 matplotlib 的函数。我在这里假设 pyplot 已作为 import matplotlib.pyplot as plt 导入。在这种情况下,有三个不同的命令可以删除内容:

请参阅 matplotlib.pyplot 函数:

plt.cla() 清除一个轴,即当前图形中的当前活动轴。它使其他轴保持不变。

plt.clf() 清除整个当前图形及其所有轴,但使窗口保持打开状态,以便可以将其重用于其他绘图。

plt.close() 关闭一个窗口,如果没有另外指定,它将是当前窗口。

因此,哪些功能最适合您取决于您的用例。

close() 函数还允许指定应关闭哪个窗口。参数可以是使用 figure(number_or_name) 创建窗口时赋予窗口的数字或名称,也可以是使用 fig = figure() 获得的图形实例 fig。如果 close() 没有参数,当前活动的窗口将被关闭。此外,还有语法 close('all'),它关闭所有图形。

Figure 类的方法

此外,Figure 类提供了清除数字的方法。下面我将假设 figFigure 的一个实例:

fig.clf() clears the entire figure。仅当 fig 是当前图形时,此调用才等效于 plt.clf()

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

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


H
Heberto Mayorquin

我今天发现了一个警告。如果您有一个多次调用绘图的函数,则最好使用 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 地图),最好清除图形并绘制新字段,而不是关闭旧图形面板并制作新图形面板。速度会完全不同。
F
Felipe

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

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

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

在此处阅读更多信息:Matplotlib, Pyplot, Pylab etc: What's the difference between these and when to use each?