180 votes

Comment puis-je dire à matplotlib que j'ai terminé un tracé ?

Le code suivant trace à deux 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 à zéro pour le deuxième tracé ?

4 votes

Pour l'anecdote, il n'est pas nécessaire d'utiliser les sous-intrigues lorsque vous n'avez qu'une seule intrigue par figure.

188voto

randlet Points 1319

Il existe une commande de chiffres clairs, et elle devrait le faire pour vous :

plt.clf()

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

plt.cla()

efface les axes actuels.

1 votes

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

4 votes

Dans mon cas, plt.clf() était suffisant pour effacer la figure mais insuffisant pour arrêter les fuites de mémoire, mais le fait d'appeler d'abord plt.close() a arrêté la fuite de mémoire. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). FYI.

133voto

David Cournapeau Points 21956

Vous pouvez utiliser figure pour créer une nouvelle parcelle, par exemple, ou utilisez close après la première parcelle.

21 votes

Le tutoriel pyplot mentionne clf() dans la section "figures multiples". Notez que si vous créez un nouveau graphique 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, ce qui peut ressembler à une fuite de mémoire.

7 votes

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

2 votes

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

35voto

lmount Points 384

Comme indiqué par @DavidCournapeau, 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 subplot(121) / subplot(122) pour la même parcelle, 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 votes

Vous devez toujours utiliser plt.clf() les chiffres sont conservés en mémoire jusqu'à leur fermeture explicite.

13voto

Dirklinux Points 314

Il suffit d'entrer plt.hold(False) avant le premier plt.plot, et vous pouvez vous en tenir à votre code original.

6 votes

Dans matplotlib==2.0.2, j'obtiens ce message : MatplotlibDeprecationWarning : pyplot.hold is deprecated.

13voto

Damo Points 319

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X