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é?

Stefano Borini
la source
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é.

David Cournapeau
la source
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.

Randlet
la source
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")
lmount
la source
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.

Dirklinux
la source
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().

Damo
la source
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 ...

Seenivasan
la source