Matplotlib (pyplot) savefig menampilkan gambar kosong

175

Saya mencoba menyimpan plot yang saya buat menggunakan matplotlib; Namun, gambar-gambarnya kosong.

Ini kode saya:

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)

Dan tessstttyyy.png kosong (juga dicoba dengan .jpg)

tylerthemiler
sumber

Jawaban:

286

Pertama, apa yang terjadi kapan T0 is not None? Saya akan menguji itu, kemudian saya akan menyesuaikan nilai-nilai yang saya berikan plt.subplot(); mungkin mencoba nilai 131, 132, dan 133, atau nilai yang bergantung pada ada atau tidaknya T0.

Kedua, setelah plt.show()dipanggil, sosok baru dibuat. Untuk mengatasinya, Anda bisa

  1. Panggil plt.savefig('tessstttyyy.png', dpi=100)sebelum meneleponplt.show()

  2. Simpan gambar sebelum Anda show()memanggil plt.gcf()"dapatkan gambar saat ini", maka Anda dapat memanggil objek savefig()ini Figurekapan saja.

Sebagai contoh:

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

Dalam kode Anda, 'tesssttyyy.png' kosong karena menyimpan angka baru, yang tidak ada yang diplot.

Yann
sumber
Lupa menghapus bagian T0 ... itu sudah dikomentari sebelumnya.
tylerthemiler
7
Kasus khusus ini terjadi pada jupyterbuku catatan dengan %matplotlib inlinediaktifkan: savefigpanggilan harus di sel yang sama dengan metode pembuatan plot.
ijoseph
3
Menarik untuk dilihat plt.show()menghasilkan gambar baru. Memang, ini menyelesaikan masalah.
user989762
Menariknya, jika Anda mengetik plt.plot, plt.savefig, plt.show satu per satu di terminal seperti spyder, itu tidak akan menampilkan gambar. Masukkan semua perintah dalam skrip dan jalankan dalam sekali jalan. Ini menunjukkan plot.
CKM
Solusi saya plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez
110

plt.show() harus datang setelah plt.savefig()

Penjelasan: plt.show()menghapus semuanya, jadi apa pun setelahnya akan terjadi pada sosok kosong baru

JAG2024
sumber
4
Itu satu-satunya cara yang membantu saya.
Yauhen
14
plt.show()membersihkan semuanya, jadi apa pun sesudahnya akan terjadi pada sosok kosong baru.
luckydonald
2
Inilah yang menyelamatkan pantat saya! : DI benar-benar tidak mengerti mengapa kita harus mengimplementasikannya dengan cara plot menghapus semuanya setelah menunjukkan gambar. Kasihan ...
Romeo Sierra
13

ubah urutan fungsi yang memperbaiki masalah untuk saya:

  • pertama Simpan plot
  • lalu Perlihatkan plotnya

sebagai berikut:

plt.savefig('heatmap.png')

plt.show()
Behzad Sezari
sumber
2

Memanggil savefig sebelum show () bekerja untuk saya.

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

izinkan saya memberi contoh yang lebih detail:

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

masukkan deskripsi gambar di sini

Jayhello
sumber