web-dev-qa-db-fra.com

Quand utiliser cla (), clf () ou close () pour effacer un tracé dans matplotlib?

Matplotlib offre ses fonctions:

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

La documentation n'offre pas beaucoup d'informations sur la différence entre ces fonctions. Quand devrais-je utiliser chaque fonction et que fait-elle exactement?

461
southoz

Ils font tous des choses différentes, puisque matplotlib utilise un ordre hiérarchique dans lequel une fenêtre de figure contient une figure pouvant comporter plusieurs axes. En outre, il existe des fonctions à partir de l'interface pyplot et des méthodes sur la classe Figure. Je vais discuter des deux cas ci-dessous.

interface pyplot

pyplot est un module qui regroupe quelques fonctions permettant à matplotlib d'être utilisé de manière fonctionnelle. Je suppose ici que pyplot a été importé sous le nom import matplotlib.pyplot as plt. Dans ce cas, trois commandes différentes permettent de supprimer des éléments:

plt.cla() efface un axe , c'est-à-dire les axes actuellement actifs dans la figure actuelle. Cela laisse les autres axes intacts.

plt.clf() efface la totalité de la figure actuelle avec tous ses axes, mais laisse la fenêtre ouverte, de sorte qu'elle puisse être réutilisée pour d'autres tracés.

plt.close() ferme une fenêtre , qui sera la fenêtre actuelle, sauf indication contraire.

La fonction qui vous convient le mieux dépend donc de votre cas d'utilisation.

La fonction close() permet en outre de spécifier quelle fenêtre doit être fermée. L’argument peut être un numéro ou un nom donné à une fenêtre lorsqu’il a été créé avec figure(number_or_name) ou bien une instance de figure fig obtenue, c’est-à-dire utilisant fig = figure(). Si aucun argument n'est donné à close(), la fenêtre actuellement active sera fermée. En outre, il existe la syntaxe close('all'), qui ferme tous les chiffres.

méthodes de la classe Figure

De plus, la classe Figure fournit des méthodes pour effacer les chiffres. Je supposerai dans la suite que fig est une instance d'un Figure:

fig.clf() efface toute la figure . Cet appel est équivalent à plt.clf() uniquement si fig est le chiffre actuel.

fig.clear() est un synonyme de fig.clf()

Notez que même del fig ne fermera pas la fenêtre de figure associée. Autant que je sache, le seul moyen de fermer une fenêtre de figure consiste à utiliser plt.close(fig) comme décrit ci-dessus.

611
David Zwicker

Il y a juste une mise en garde que j'ai découverte aujourd'hui. Si vous avez souvent une fonction qui appelle un tracé, vous feriez mieux d'utiliser plt.close(fig) au lieu de fig.clf(), le premier ne s'accumulant pas en mémoire. En bref si la mémoire vous préoccupe, utilisez plt.close (fig) (Même s’il semble y avoir de meilleurs moyens, passez à la fin de ce commentaire pour liens pertinents).

Ainsi, le script suivant produira une liste vide:

for i in range(5):
    fig = plot_figure()
    plt.close(fig)
# This returns a list with all figure numbers available
print(plt.get_fignums())

Tandis que celui-ci produira une liste avec cinq chiffres.

for i in range(5):
    fig = plot_figure()
    fig.clf()
# This returns a list with all figure numbers available
print(plt.get_fignums())

D'après la documentation ci-dessus, la différence entre fermer une figure et fermer une fenêtre ne me semble pas claire. Cela clarifiera peut-être.

Si vous voulez essayer un script complet, vous avez:

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

Si la mémoire est une préoccupation, quelqu'un a déjà posté une solution de contournement dans SO voir: créer une figure qui compte la référence

66
Ramon Martinez

plt.cla () signifie effacer l'axe du courant

plt.clf () signifie effacer le chiffre actuel

aussi, il y a plt.gca () (obtenir l'axe actuel) et plt.gcf () (obtenir le chiffre actuel)

Lisez plus ici: Matplotlib, Pyplot, Pylab, etc.: Quelle est la différence entre ces deux règles et quand les utiliser?

8
Felipe Almeida