Savefig gibt ein leeres Bild aus

Lesezeit: 3 Minuten

Tylerthemilers Benutzeravatar
Tylerthemiler

Ich versuche, Diagramme 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 (habe es auch mit .jpg versucht)

Erstens: 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 vielleicht mit den Werten 131, 132 und 133 oder mit Werten, die davon abhängen, ob oder nicht T0 existiert.

Zweitens, danach plt.show() aufgerufen wird, entsteht eine neue Figur. Um damit umzugehen, können Sie

  1. Forderung plt.savefig('tessstttyyy.png', dpi=100) bevor Sie anrufen plt.show()

  2. Bewahren Sie die Figur vor Ihnen auf show() per Anruf plt.gcf() für „aktuelle Zahl abrufen“, dann können Sie anrufen savefig() dazu Figure jederzeit Widerspruch einlegen.

Zum Beispiel:

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

In Ihrem Code ist „tesssttyyy.png“ leer, da es die neue Figur speichert, für die noch nichts gezeichnet wurde.

  • Ich habe vergessen, den T0-Teil zu entfernen … es wurde zuvor kommentiert.

    – Tylerthemiler

    26. Januar 2012 um 1:18

  • Ein Sonderfall hiervon tritt auf jupyter Notizbücher mit %matplotlib inline aktiviert: die savefig Der Aufruf muss in derselben Zelle erfolgen wie die Ploterstellungsmethode.

    – Joseph

    6. Januar 2018 um 1:31


  • Interessant zu sehen plt.show() erzeugt ein neues Bild. Tatsächlich wurde das Problem dadurch gelöst.

    – Benutzer989762

    15. August 2018 um 8:21 Uhr

  • Interessanterweise wird fig nicht angezeigt, wenn Sie plt.plot, plt.savefig, plt.show nacheinander in einem Terminal wie Spyder eingeben. Fügen Sie alle Befehle in ein Skript ein und führen Sie sie auf einmal aus. Es zeigt die Handlung.

    – CKM

    9. Okt. 2018 um 6:57

  • @CKM Hallo. Wissen Sie zufällig, warum das passiert? Ich dachte, es sei tatsächlich ein Problem, das Funktionen wie verursacht plt.ylabel() Erstellen Sie eine neue Figur, anstatt sie auf die aktuelle (hier gepostet) anzuwenden, und speichern Sie die Figuren auch leer. Ich habe eine Figur gezeichnet und sie in derselben Zeile (getrennt durch) gespeichert ;) und es hat funktioniert. Ist das nur ein Problem mit Spyder?

    – TheSprinter

    10. Juli 2020 um 14:20 Uhr


Benutzeravatar von JAG2024
JAG2024

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

Erläuterung: plt.show() löscht das Ganze, sodass alles, was danach folgt, mit einer neuen leeren Figur geschieht

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

  • Erste Speichern die Handlung
  • Dann Zeigen die Handlung

wie folgt:

plt.savefig('heatmap.png')

plt.show()

Krishs Benutzeravatar
Krish

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

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 eine Bildbeschreibung ein

1452630cookie-checkSavefig gibt ein leeres Bild aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy