Когда использовать cla(), clf() или close() для очистки участка в matplotlib?

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. В этом случае есть три команды, которые удаляют вещи:

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), как описано выше.

Ответ 2

Есть только предостережение, которое я обнаружил сегодня. Если у вас есть функция, которая много раз вызывает сюжет, лучше использовать plt.close(fig) вместо fig.clf(), так как первая не накапливается в памяти. Короче говоря , если память вызывает озабоченность, используйте plt.close(fig) (хотя кажется, что есть более эффективные способы, перейдите к концу этого комментария для соответствующих ссылок).

Итак, следующий script создаст пустой список:

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())

Из приведенной выше документации неясно, в чем разница между закрытием фигуры и закрытием окна. Возможно, это прояснится.

Если вы хотите попробовать полный script, у вас есть:

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, см. Создайте цифру с подсчетом ссылок