matplotlib.pyplot não esquecerá os gráficos anteriores - como posso liberar / atualizar?

88

Como você consegue matplotlib.pyplot"esquecer" plotagens anteriores

Estou tentando plotar várias vezes usando matplotlib.pyplot

O código é parecido com este:

def plottest():
    import numpy as np
    import matplotlib.pyplot as plt


    a=np.random.rand(10,)
    b=np.random.rand(10,)
    c=np.random.rand(10,)


    plt.plot(a,label='a')
    plt.plot(b,label='b')
    plt.plot(c,label='c')
    plt.legend(loc='upper left')
    plt.ylabel('mag')
    plt.xlabel('element)')
    plt.show()

    e=np.random.rand(10,)
    f=np.random.rand(10,)
    g=np.random.rand(10,)


    plt.plot(e,label='e')
    plt.plot(f,label='f')
    plt.plot(g,label='g')
    plt.legend(loc='upper left')
    plt.ylabel('mag')
    plt.xlabel('element)')
    plt.show()

Infelizmente, continuo obtendo o mesmo gráfico (na verdade, de algum outro código que executei e concluí há um tempo), não importa o que eu faça.

Código semelhante funcionou anteriormente para mim.

Eu olhei para estas questões:

Como "limpar a lousa"?

Matplotlib pyplot show () não funciona depois de fechado

(python) matplotlib pyplot show () .. bloqueando ou não?

e tentei usar plt.show(), plt.clf()e plt.closesem sucesso.

Alguma ideia?

atomh33ls
fonte

Respostas:

112

Eu prefiro usar plt.clf()depois de cada plt.show()para apenas limpar a figura atual em vez de fechá-la e reabri-la, mantendo o tamanho da janela e dando a você um melhor desempenho e uso de memória muito melhor.

Da mesma forma, você poderia fazer plt.cla() apenas para limpar os eixos atuais .

Para limpar eixos específicos , útil quando você tem vários eixos em uma figura, você pode fazer, por exemplo:

fig, axes = plt.subplots(nrows=2, ncols=2)

axes[0, 1].clear()
Saullo GP Castro
fonte
47

Descobri que esse comportamento só ocorre depois de executar um script específico, semelhante ao da pergunta. Não tenho ideia de por que isso ocorre.

Funciona (atualiza os gráficos) se eu colocar

plt.clf()
plt.cla()
plt.close()

depois de cada plt.show()

atomh33ls
fonte