Comment puis-je dire à matplotlib que j'ai fini avec un complot?


166

Le code suivant trace sur deux fichiers PostScript (.ps), mais le second contient les deux lignes.

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(111)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.subplot(111)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

Comment puis-je dire à matplotlib de recommencer pour le deuxième tracé?


3
comme point de style, il n'est pas nécessaire d'utiliser un sous-tracé lorsque vous n'avez qu'un seul tracé par figure.
Autoplectic

Réponses:


124

Vous pouvez utiliser figurepour créer un nouveau tracé, par exemple, ou utiliser closeaprès le premier tracé.


19
Le tutoriel pyplot mentionne clf () dans la section "plusieurs figures". Notez que si vous créez simplement un nouveau tracé avec figure () sans fermer l'ancien avec close () (même si vous fermez la fenêtre GUI), pyplot conserve une référence à votre ancienne figure, qui peut ressembler à une fuite de mémoire.
Jouni K. Seppänen

5
Vous pouvez utiliser plt.close () / pylab.close () pour supprimer toutes les anciennes figures
Calvin1602

1
Après la première intrigue, voulez-vous dire après plt.savefig("first.ps")?
Sigur

@ JouniK.Seppänen Juste pour ajouter à votre commentaire, Python vous avertira par défaut si vous ouvrez de nombreuses figures: "RuntimeWarning: Plus de 20 chiffres ont été ouverts.".
rph

173

Il y a une commande de figure claire, et elle devrait le faire pour vous:

plt.clf()

Si vous avez plusieurs sous-graphiques dans la même figure

plt.cla()

efface les axes actuels.


1
Merci! Si vous utilisez le backend PDF (qui vous permet de sauvegarder plusieurs tracés), vous devrez l'appeler après chaque appel à plt.save ()
Ben DeMott

4
Dans mon cas, plt.clf () était suffisant pour effacer la figure mais insuffisant pour arrêter les fuites de mémoire, mais le premier appel à plt.close () a arrêté la fuite de mémoire. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). FYI.
DJDuff

29

Comme indiqué par David Cournapeau, utilisez figure ().

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.figure()
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.figure()
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

Ou sous-tracé (121) / sous-tracé (122) pour le même tracé, position différente.

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(121)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")

plt.subplot(122)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

3
vous devriez toujours utiliser plt.clf(), les chiffres sont conservés en mémoire jusqu'à ce qu'ils
soient

13

Entrez simplement plt.hold(False)avant le premier plt.plot, et vous pouvez vous en tenir à votre code d'origine.


6
dans matplotlib == 2.0.2, je reçois ce message: MatplotlibDeprecationWarning: pyplot.hold est obsolète.
Jonathan

12

Si vous utilisez Matplotlib de manière interactive, par exemple dans une application Web, (par exemple ipython), vous recherchez peut-être

plt.show()

au lieu de plt.close()ou plt.clf().


vous venez de me faire gagner du temps que je n'avais pas à perdre
reculer le

1

Si aucun d'entre eux ne fonctionne, vérifiez ceci ... disons si vous avez des tableaux x et y de données le long des axes respectifs. Vérifiez ensuite dans quelle cellule (jupyter) vous avez initialisé x et y pour vider. C'est parce que, peut-être que vous ajoutez des données à x et y sans les réinitialiser. L'intrigue a donc aussi de vieilles données. Alors vérifiez ça ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.