Matplotlib (pyplot) savefig gibt ein leeres Bild aus

174

Ich versuche, Plots zu speichern, die ich mit matplotlib erstellt habe. Die Bilder werden jedoch leer gespeichert.

Hier ist mein Code:

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)

Und tessstttyyy.png ist leer (auch mit .jpg versucht)

tylerthemiler
quelle

Antworten:

285

Was passiert wann T0 is not None? Ich würde das testen und dann die Werte anpassen, an die ich übergebe plt.subplot(). Versuchen Sie es mit den Werten 131, 132 und 133 oder mit Werten, die davon abhängen, ob sie vorhanden sind oder nicht T0.

Zweitens wird nach dem plt.show()Aufruf eine neue Figur erstellt. Um damit umzugehen, können Sie

  1. Rufen plt.savefig('tessstttyyy.png', dpi=100)Sie an, bevor Sie anrufenplt.show()

  2. Speichern Sie die Figur vor sich, show()indem Sie plt.gcf()"Aktuelle Figur abrufen" aufrufen. Dann können Sie savefig()dieses FigureObjekt jederzeit aufrufen .

Beispielsweise:

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

In Ihrem Code ist 'tesssttyyy.png' leer, da die neue Figur gespeichert wird, für die nichts geplottet wurde.

Yann
quelle
Ich habe vergessen, das T0-Teil zu entfernen ... es wurde zuvor kommentiert.
Tylerthemiler
7
Ein Sonderfall hierfür tritt jupyterbei %matplotlib inlineaktivierten Notebooks auf : Der savefigAufruf muss sich in derselben Zelle befinden wie die Plot-Erstellungsmethode.
Ijoseph
3
Interessant zu sehen plt.show()erzeugt ein neues Bild. In der Tat löste dies das Problem.
user989762
Interessanterweise wird, wenn Sie plt.plot, plt.savefig, plt.show einzeln in einem Terminal wie spyder eingeben, keine Abbildung angezeigt. Fügen Sie alle Befehle in ein Skript ein und führen Sie sie auf einmal aus. Es zeigt die Handlung.
CKM
Meine Lösung plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez
109

plt.show() sollte danach kommen plt.savefig()

Erklärung: plt.show()Löscht das Ganze, sodass danach alles auf einer neuen leeren Figur passiert

JAG2024
quelle
4
Das hat mir nur geholfen.
Yauhen
14
plt.show()löscht das Ganze, so dass danach alles auf einer neuen leeren Figur passiert.
Luckydonald
2
Das hat meinen Hintern gerettet! : DI versteht wirklich nicht, warum man es so implementieren musste, dass die Handlung beim Anzeigen des Bildes alles löscht. Schade ...
Romeo Sierra
12

Ändern Sie die Reihenfolge der Funktionen behoben das Problem für mich:

  • Speichern Sie zuerst das Grundstück
  • dann Zeigen Sie die Handlung

wie folgt:

plt.savefig('heatmap.png')

plt.show()
Behzad Sezari
quelle
2

Das Aufrufen von savefig vor show () hat bei mir funktioniert.

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
quelle
1

Lassen Sie mich ein detaillierteres Beispiel geben:

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

Geben Sie hier die Bildbeschreibung ein

Jayhello
quelle