Matplotlib (pyplot) savefig çıktıları boş resim


178

Matplotlib kullanarak yaptığım arazileri kurtarmaya çalışıyorum; ancak görüntüler boştur.

İşte benim kod:

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)

Ve tessstttyyy.png boş (.jpg ile de denendi)

Yanıtlar:


289

İlk olarak, ne zaman olur T0 is not None? Bunu test ederdim, sonra verdiğim değerleri ayarlardım plt.subplot(); belki 131, 132 ve 133 değerlerini veya T0var olup olmamasına bağlı olan değerleri deneyin .

İkincisi, sonra plt.show()denir, yeni bir figür oluşturulur. Bununla başa çıkmak için şunları yapabilirsiniz:

  1. Aramadan plt.savefig('tessstttyyy.png', dpi=100)önce arayınplt.show()

  2. "Mevcut rakamı al" için show()çağırarak rakamı kaydedin plt.gcf(), daha sonra istediğiniz zaman savefig()bu Figurenesneyi arayabilirsiniz .

Örneğin:

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

Kodunuzda, 'tesssttyyy.png' boş çünkü hiçbir şeyin çizilmediği yeni rakamı kaydediyor.


T0 bölümünü kaldırmayı unuttum ... daha önce yorumlanmıştı.
tylerthemiler

7
Bunun özel bir durumu, etkinleştirilmiş jupyternot defterlerinde gerçekleşir %matplotlib inline: savefigçağrı, çizim oluşturma yöntemiyle aynı hücrede olmalıdır.
ijoseph

3
Görmek ilginç plt.show()yeni bir görüntü oluşturur. Gerçekten, bu sorunu çözdü.
user989762

İlginç bir şekilde, plt.plot, plt.savefig, plt yazın. Spyder gibi terminalde birer birer göster, incir göstermeyecektir. Tüm komutu bir betiğe koyun ve tek seferde çalıştırın. Grafiği gösterir.
CKM

Çözümüm plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez

111

plt.show() sonra gelmeli plt.savefig()

Açıklama: plt.show()her şeyi temizler, böylece daha sonra yeni bir boş figürde her şey olur


4
Bana bu şekilde yardımcı oldu.
Yauhen

14
plt.show()her şeyi temizler, böylece daha sonra yeni bir boş figürde her şey olur.
luckydonald

2
Kıçımı kurtaran bu oldu! : DI gerçekten neden görüntüyü gösterdikten sonra komplo her şeyi siler bir şekilde uygulamak zorunda olduğunu anlamıyorum. Yazık ...
Romeo Sierra

13

işlevlerin sırasını değiştirmek sorunu benim için düzeltti :

  • önce çizimi kaydedin
  • sonra çizimi göster

aşağıdaki gibi:

plt.savefig('heatmap.png')

plt.show()

2

Show () 'dan önce savefig çağrısı benim için çalıştı.

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

daha ayrıntılı bir örnek vereyim:

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

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.