2009-04-12 4 views
113

Le code suivant trace deux fichiers PostScript (.ps), mais le second contient les deux lignes.Comment puis-je dire à matplotlib que j'ai terminé avec un complot?

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 prendre un nouveau départ pour la deuxième parcelle?

+3

en tant que point de style, il n'est pas nécessaire d'utiliser la sous-trame lorsque vous n'avez qu'un seul graphique par figure. – Autoplectic

Répondre

95

Vous pouvez utiliser figure pour créer un nouveau tracé, par exemple, ou utiliser close après le premier tracé.

+7

Super! Merci! Je trouve difficile de trouver ce dont j'ai besoin dans le format de documentation actuel. La page de pyplot est très longue, et je n'ai pas pu voir l'entrée de close() pendant le défilement. Je cherchais quelque chose comme clean() clear() ou flush(). –

+15

Le tutoriel pyplot mentionne clf() dans la section "figures multiples". Notez que si vous créez simplement un nouveau graphique avec figure() sans fermer l'ancien avec close() (même si vous fermez la fenêtre de l'interface graphique), pyplot conserve une référence à votre ancienne image, ce qui peut ressembler à une fuite de mémoire. –

+3

Vous pouvez utiliser plt.close()/pylab.close() pour supprimer tous les anciens chiffres – Calvin1602

130

Il y a une commande de chiffre précis, et il devrait le faire pour vous:

plt.clf() 

Si vous avez plusieurs intrigues secondaires dans la même figure

plt.cla() 

efface les axes actuels.

+2

ty tellement pour cela. J'avais des graphiques à barres qui «saignaient» dans les graphiques suivants. Cette commande a fonctionné parfaitement !! – anon58192932

+1

Merci! Si vous utilisez le backend PDF (qui vous permet d'enregistrer plusieurs trames), vous devrez l'appeler après chaque appel à plt.save() –

+3

Dans mon cas, plt.clf() était suffisant pour effacer la figure mais insuffisant pour Arrêtez les fuites de mémoire, mais en appelant d'abord plt.close() a arrêté la fuite de mémoire. Python 2.7, matplotlib 1.1.1rc1 (Ubuntu 12.04). FYI. –

27

Comme indiqué par David Cournapeau, utilisez la 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") 

Sous-placette (121)/sous-placette (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") 
12

il suffit d'entrer plt.hold(False) avant le premier plt.plot, et vous pouvez coller à votre code d'origine.

+1

dans matplotlib == 2.0.2, j'obtiens ce message: MatplotlibDeprecationWarning: pyplot.hold est obsolète. – Jonathan

3

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

plt.show() 

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

0

Si aucun d'entre eux ne fonctionne, vérifiez par exemple si vous avez des tableaux de données x et y le long de l'axe respectif. Vérifiez ensuite dans quelle cellule (jupyter) vous avez initialisé x et y pour vider. En effet, vous ajoutez peut-être des données à x et y sans les réinitialiser. Donc, l'intrigue a aussi d'anciennes données. Donc, vérifiez que ...

Questions connexes