Como digo ao matplotlib que terminei com uma plotagem?

165

O código a seguir plota em dois arquivos PostScript (.ps), mas o segundo contém as duas linhas.

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")

Como posso dizer ao matplotlib para iniciar novamente o segundo gráfico?

Stefano Borini
fonte
3
como um ponto de estilo, não há necessidade de usar subtrama quando você tem apenas um gráfico por figura.
Autoplectic 12/04/09

Respostas:

123

Você pode usar figurepara criar uma nova plotagem, por exemplo, ou usar closeapós a primeira plotagem.

David Cournapeau
fonte
19
O tutorial do pyplot menciona clf () na seção "figuras múltiplas". Observe que, se você acabou de criar um novo gráfico com a figura () sem fechar o antigo com close () (mesmo se você fechar a janela da GUI), o pyplot mantém uma referência à sua figura antiga, que pode parecer um vazamento de memória.
Jouni K. Seppänen
5
Você pode usar plt.close () / pylab.close () para remover todos os valores antigos
Calvin1602
1
Após o primeiro enredo, você quer dizer depois plt.savefig("first.ps")?
Sigur
@ JouniK.Seppänen Apenas para adicionar ao seu comentário, o Python por padrão avisará se você abrir muitas figuras: "RuntimeWarning: Mais de 20 figuras foram abertas.".
Rph 14/18
173

Há um comando de figura clara e deve ser feito por você:

plt.clf()

Se você tiver várias subparcelas na mesma figura

plt.cla()

limpa os eixos atuais.

randlet
fonte
1
Obrigado! Se você estiver usando o backend PDF (que lhe permite salvar várias parcelas) você vai precisar ligar para isso depois de cada chamada para plt.save ()
Ben DeMott
4
No meu caso, plt.clf () foi suficiente para limpar a figura, mas insuficiente para interromper o vazamento de memória, mas a primeira chamada de plt.close () interrompeu o vazamento de memória. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). PARA SUA INFORMAÇÃO.
DJDuff
29

Conforme afirmado por David Cournapeau, use a figura ().

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 subtrama (121) / subtrama (122) para o mesmo gráfico, posição diferente.

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")
Montar
fonte
3
você ainda deve usar plt.clf(), figuras são mantidos na memória até ser explicitamente fechado
kaveish
13

Basta entrar plt.hold(False)antes do primeiro plt.plot, e você poderá manter seu código original.

Dirklinux
fonte
6
no matplotlib == 2.0.2, recebo esta mensagem: MatplotlibDeprecationWarning: pyplot.hold está obsoleto.
7137 Jonathan
12

Se você estiver usando o Matplotlib interativamente, por exemplo, em um aplicativo da web (por exemplo, ipython), talvez esteja procurando

plt.show()

em vez de plt.close()ou plt.clf().

Damo
fonte
você acabou de me poupar um monte de tempo que eu não precisava perder
reabow
1

Se nenhum deles estiver funcionando, verifique isso .. diga se você tem matrizes xey de dados ao longo do respectivo eixo. Em seguida, verifique em qual célula (jupyter) você inicializou x e y para esvaziar. Isso ocorre porque, talvez você esteja anexando dados a x e y sem reinicializá-los. Portanto, o enredo também tem dados antigos. Então verifique isso ..

Seenivasan
fonte