何时使用cla(),clf()或关闭()清除matplotlib中的情节?

Matplotlib提供了以下功能:

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

我应该什么时候使用每个函数,它到底做了什么?

1022939 次浏览

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

pymap接口

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类提供了清除数字的方法。 我将在下面假设figFigure的实例:

fig.clf()清除整个图形。仅当fig是当前数字时,此调用等效于plt.clf()

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

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

我今天发现了一个问题。 如果你有一个函数多次调用一个情节,你最好使用plt.close(fig)而不是fig.clf()不知何故,第一个不会在内存中积累。简而言之如果内存是一个问题,请使用plt.close(图)(虽然似乎有更好的方法,但请转到本评论的末尾以获取相关链接)。

因此,以下脚本将生成一个空列表:

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中发布了一个解决方法,请参阅: 创建一个引用计数的图形

plt.cla()表示明流轴

plt.clf()表示明确的当前数字

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

阅读更多:Matplotlib、Pyplo、Pylab等:它们之间有什么区别以及何时使用它们?