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?


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.


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.


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

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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.