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.