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

Matplotlib propose des 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 dois-je utiliser chaque fonction et que fait-elle exactement?

Ils font tous des choses différentes, car matplotlib utilise un ordre hiérarchique dans lequel une fenêtre de figure contient une figure pouvant être constituée de plusieurs axes. De plus, il existe des fonctions de l’interface pyplot et il existe des méthodes sur la classe Figure . Je discuterai des deux cas ci-dessous.

interface pyplot

pyplot est un module qui recueille quelques fonctions permettant d’utiliser Matplotlib de manière fonctionnelle. Je suppose ici que pyplot a été importé en tant import matplotlib.pyplot as plt . Dans ce cas, il y a trois commandes différentes qui suppriment des choses:

plt.cla() efface les axes , c’est-à-dire les axes actuellement actifs dans la figure actuelle. Il laisse les autres axes intacts.

plt.clf() efface l’intégralité 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 en cours, sinon spécifiée.

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 soit un nombre, soit un nom donné à une fenêtre lors de sa création à l’aide de la figure(number_or_name) ou une figure obtenue à l’aide de fig = figure() . Si aucun argument n’est donné à close() , la fenêtre actuellement active sera fermée. De plus, il y a la syntaxe close('all') , qui ferme toutes les figures.

méthodes de la classe Figure

De plus, la classe Figure fournit des méthodes pour effacer les chiffres. Je suppose que la fig est une instance de la Figure :

fig.clf() efface le chiffre entier . Cet appel est équivalent à plt.clf() seulement 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 associée. Pour autant que je sache, le seul moyen de fermer une fenêtre de figure est d’utiliser plt.close(fig) comme décrit ci-dessus.

Il y a juste une mise en garde que j’ai découverte aujourd’hui. Si vous avez une fonction qui appelle un tracé beaucoup de fois, mieux vaut utiliser plt.close(fig) au lieu de fig.clf() manière ou d’une autre, le premier ne s’accumule pas en mémoire. En bref si la mémoire est un problème, utilisez plt.close (fig) (Bien qu’il semble y avoir de meilleurs moyens, allez à la fin de ce commentaire pour les 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()) 

Alors que celui-ci produira une liste de 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()) 

La documentation ci-dessus ne me montre pas clairement quelle est la différence entre fermer une figure et fermer une fenêtre. Peut-être que cela clarifiera.

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 un problème, quelqu’un a déjà publié un contournement dans SO, voir: Créer un chiffre compté par référence