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)

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.


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


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

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.