Matplotlib(pyplot)savefigが空白の画像を出力する


175

私はmatplotlibを使用して作成したプロットを保存しようとしています。ただし、画像は空白で保存されます。

これが私のコードです:

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)

tessstttyyy.pngは空白です(.jpgでも試してみます)

回答:


286

まず、何が起こるのT0 is not Noneですか?それをテストしてからplt.subplot()、渡す値を調整します。131、132、133の値、またはT0存在するかどうかに依存する値を試してください。

次に、plt.show()が呼び出された後、新しい図が作成されます。これに対処するには、

  1. 電話するplt.savefig('tessstttyyy.png', dpi=100)前に電話するplt.show()

  2. 「現在の図形を取得」をshow()呼び出す前に、図形を保存しておけば、いつでもこのオブジェクトをplt.gcf()呼び出せます。savefig()Figure

例えば:

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

コードでは、何もプロットされていない新しいFigureを保存しているため、「tesssttyyy.png」は空白です。


T0パーツを削除するのを忘れました...以前にコメントされました。
tylerthemiler 2012年

7
この特殊なケースはjupyter%matplotlib inline有効になっているノートブックで発生しsavefigます。呼び出しは、プロット作成メソッドと同じセル内にある必要があります。
ijoseph 2018年

3
見るのがplt.show()面白くて新しい画像が生成されます。実際、これで問題は解決しました。
user989762

興味深いことに、spyderなどのターミナルでplt.plot、plt.savefig、plt.showを1つずつ入力すると、図は表示されません。すべてのコマンドをスクリプトに入れて、一度に実行します。それはプロットを示しています。
CKM

私のソリューションplt.show()plt.draw()fig.set_dpi(200)fig.savefig( '/ image.png')
EduardoUstarez

110

plt.show() 後に来る必要があります plt.savefig()

説明:plt.show()全体をクリアするため、その後は何もない空の図で発生します


4
それが私を助けた唯一の方法です。
Yauhen

14
plt.show()すべてがクリアされるので、その後は何もない空の図で発生します。
ラッキードナルド

2
これは私の尻を救ったものです!:DIは、プロットが画像を表示するときにすべてを消去するように実装する必要があった理由を本当に理解していません。残念...
ロミオシエラ

13

関数の順序を変更して、問題解決しました:

  • 最初 にプロットを保存します
  • 次に 、プロットを表示します

次のように:

plt.savefig('heatmap.png')

plt.show()

2

show()が機能する前にsavefigを呼び出しました。

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

より詳細な例を挙げましょう:

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

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.