Matplotlib (pyplot) savefig gera uma imagem em branco

175

Estou tentando salvar plotagens feitas usando matplotlib; no entanto, as imagens são salvas em branco.

Aqui está o meu código:

plt.subplot(121)
plt.imshow(dataStack, cmap=mpl.cm.bone)

plt.subplot(122)
y = copy.deepcopy(tumorStack)
y = np.ma.masked_where(y == 0, y)

plt.imshow(dataStack, cmap=mpl.cm.bone)
plt.imshow(y, cmap=mpl.cm.jet_r, interpolation='nearest')

if T0 is not None:
    plt.subplot(123)
    plt.imshow(T0, cmap=mpl.cm.bone)

    #plt.subplot(124)
    #Autozoom

#else:
    #plt.subplot(124)
    #Autozoom

plt.show()
plt.draw()
plt.savefig('tessstttyyy.png', dpi=100)

E tessstttyyy.png está em branco (também tentei com .jpg)

tylerthemiler
fonte

Respostas:

286

Primeiro, o que acontece quando T0 is not None? Eu testaria isso, depois ajustaria os valores para os quais passo plt.subplot(); talvez tente os valores 131, 132 e 133, ou valores que dependem da existência ou não de valores T0.

Segundo, depois que plt.show()é chamado, uma nova figura é criada. Para lidar com isso, você pode

  1. Ligue plt.savefig('tessstttyyy.png', dpi=100)antes de ligarplt.show()

  2. Salve a figura à sua frente show()chamando plt.gcf()"obter figura atual", e poderá chamar savefig()esse Figureobjeto a qualquer momento.

Por exemplo:

fig1 = plt.gcf()
plt.show()
plt.draw()
fig1.savefig('tessstttyyy.png', dpi=100)

No seu código, 'tesssttyyy.png' está em branco porque está salvando a nova figura, na qual nada foi plotado.

Yann
fonte
Esqueceu de remover a parte T0 ... foi comentada anteriormente.
Tylerthemiler
7
Um caso especial disso ocorre em jupytercadernos com %matplotlib inlinehabilitado: a savefigchamada deve estar na mesma célula que o método de criação de plotagem.
ijoseph
3
Interessante ver plt.show()gera uma nova imagem. De fato, isso resolveu o problema.
user989762
Curiosamente, se você digitar plt.plot, plt.savefig, plt.show, um por um no terminal, como o spyder, ele não mostrará a fig. Coloque todo o comando em um script e execute de uma só vez. Mostra o enredo.
CKM
Minha solução plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez 9/04
110

plt.show() deve vir depois plt.savefig()

Explicação: plt.show()limpa tudo, para que qualquer coisa depois aconteça em uma nova figura vazia

JAG2024
fonte
4
Essa é a única maneira que me ajudou.
Yauhen
14
plt.show()limpa tudo, então qualquer coisa depois acontecerá em uma nova figura vazia.
luckydonald
2
Foi isso que salvou minha bunda! : Você realmente não entende por que alguém teve que implementá-lo de uma maneira que o enredo apaga tudo ao mostrar a imagem. Pena ...
Romeo Sierra
13

alterar a ordem das funções corrigiu o problema para mim:

  • primeiro Salve o enredo
  • em seguida, mostre o gráfico

como segue:

plt.savefig('heatmap.png')

plt.show()
Behzad Sezari
fonte
2

Chamar savefig antes de show () funcionou para mim.

fig ,ax = plt.subplots(figsize = (4,4))
sns.barplot(x='sex', y='tip', color='g', ax=ax,data=tips)
sns.barplot(x='sex', y='tip', color='b', ax=ax,data=tips)
ax.legend(['Male','Female'], facecolor='w')

plt.savefig('figure.png')
plt.show()
Krish
fonte
1

vamos dar um exemplo mais detalhado:

import numpy as np
import matplotlib.pyplot as plt


def draw_result(lst_iter, lst_loss, lst_acc, title):
    plt.plot(lst_iter, lst_loss, '-b', label='loss')
    plt.plot(lst_iter, lst_acc, '-r', label='accuracy')

    plt.xlabel("n iteration")
    plt.legend(loc='upper left')
    plt.title(title)
    plt.savefig(title+".png")  # should before plt.show method

    plt.show()


def test_draw():
    lst_iter = range(100)
    lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
    # lst_loss = np.random.randn(1, 100).reshape((100, ))
    lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
    # lst_acc = np.random.randn(1, 100).reshape((100, ))
    draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")


if __name__ == '__main__':
    test_draw()

insira a descrição da imagem aqui

Jayhello
fonte