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.