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)

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.


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


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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.