Коли використовувати cla (), clf () або close () для очищення ділянки в matplotlib?


540

Matplotlib пропонує там функції:

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

Документація не пропонує багато розуміння того, в чому полягає різниця між цими функціями. Коли я повинен використовувати кожну функцію і що саме вона робить?

Відповіді:


713

Всі вони роблять різні речі, оскільки 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клас надає методи очищення фігур. В наступному я припускаю, що figце примірник Figure:

fig.clf()очищає всю фігуру . Цей виклик еквівалентний plt.clf()лише тоді, коли figє поточна цифра.

fig.clear() є синонімом для fig.clf()

Зверніть увагу, що навіть del figне закриється вікно пов'язаної фігури. Наскільки мені відомо, єдиний спосіб закрити вікно фігури - це, plt.close(fig)як описано вище.


38
Оскільки close()це неспецифічна команда, я пішов шукати спосіб визначити закриття фігури ( fig.close()це не функція). Правильний синтаксис: plt.close(fig).
tyleha

що з того clear(), я не бачив великої різниці cla()лише в тому, що в осях-паразитах cla()обробляють тільки спеціально.
тире

1
У clear()моїй функції немає matplotlib.pyplot(версія 1.4.2 на MacOS). Не могли б ви направити мене до відповідної документації?
Девід Цвікер

2
І клас Фігура, і Осі мають clear()метод. Figure.clearЕквівалент clfі Axes.clearеквівалентний cla.
SiggyF

2
Чи працює це щодо юпітера? Я продовжую вражати помилки пам’яті, тому що цифри не збираються сміттям, коли я перебираю клітинку в соковитій.
CMCDragonkai

79

Є лише застереження, яке я відкрив сьогодні. Якщо у вас є функція, яка викликає сюжет багато разів, вам краще використовувати 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, дивіться: Створіть фігуру, яка посилається


26
Дякуємо за корисну перехресне посилання на питання щодо підрахунку посилань. Саме так вже повинен працювати Matplotlib . Настільки ж жахливо і жахливо, що цифри ніколи не збирають сміття за стандартним pyplotAPI.
Сесіль Карі

1
Тим не менш, я виявив, що якщо потрібно робити анімацію (наприклад, деякі 2D-контурні / pcolormesh карти), то краще очистити фігуру та намалювати нові поля, а не закривати старі та робити нові фігурні панелі. Швидкість буде абсолютно різною.
msi_gerva

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.