Matplotlib (pyplot) savefig genera un'immagine vuota


176

Sto cercando di salvare i grafici che realizzo usando matplotlib; tuttavia, le immagini vengono salvate in bianco.

Ecco il mio codice:

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 è vuoto (provato anche con .jpg)

Risposte:


286

Innanzitutto, cosa succede quando T0 is not None? Lo testerei, quindi regolerei i valori a cui passo plt.subplot(); forse prova i valori 131, 132 e 133 o valori che dipendono dall'esistenza o meno T0.

In secondo luogo, dopo che plt.show()viene chiamato, viene creata una nuova figura. Per farcela, puoi

  1. Chiama plt.savefig('tessstttyyy.png', dpi=100)prima di chiamareplt.show()

  2. Salvare la figura prima show()di chiamare chiamando plt.gcf()"ottieni la figura corrente", quindi è possibile chiamare savefig()questo Figureoggetto in qualsiasi momento.

Per esempio:

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

Nel tuo codice, "tesssttyyy.png" è vuoto perché sta salvando la nuova figura, a cui non è stato tracciato nulla.


Hai dimenticato di rimuovere la parte T0 ... è stata commentata in precedenza.
tylerthemiler,

7
Un caso speciale si verifica nei jupyternotebook con %matplotlib inlineabilitato: la savefigchiamata deve trovarsi nella stessa cella del metodo di creazione della trama.
ijoseph,

3
Interessante da vedere plt.show()genera una nuova immagine. In effetti, questo ha risolto il problema.
user989762,

È interessante notare che se si digita plt.plot, plt.savefig, plt.show uno per uno nel terminale come spyder, non mostrerà fig. Inserisci tutti i comandi in uno script ed eseguili in una volta sola. Mostra la trama.
CKM,

La mia soluzione plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez

110

plt.show() dovrebbe venire dopo plt.savefig()

Spiegazione: plt.show()cancella il tutto, quindi in seguito tutto accadrà su una nuova figura vuota


4
Questo è l'unico modo che mi ha aiutato.
Yauhen,

14
plt.show()cancella il tutto, quindi tutto ciò che succederà successivamente su una nuova figura vuota.
luckydonald,

2
Questo è ciò che mi ha salvato il culo! : DI davvero non capisco perché uno abbia dovuto implementarlo in modo che la trama cancella tutto quando mostra l'immagine. Peccato ...
Romeo Sierra,

13

cambiare l'ordine delle funzioni risolto il problema per me:

  • prima salva la trama
  • quindi Mostra la trama

come segue:

plt.savefig('heatmap.png')

plt.show()

2

Chiamare savefig prima di show () ha funzionato per me.

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

1

fammi fare un esempio più dettagliato:

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.