Matplotlib (pyplot) savefig는 빈 이미지를 출력합니다.


174

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)

코드에서 'tesssttyyy.png'는 아무것도 그려지지 않은 새 그림을 저장하기 때문에 비어 있습니다.


T0 부분을 제거하는 것을 잊었습니다 ... 이전에 주석 처리되었습니다.
tylerthemiler

7
특별한 경우는 활성화 된 jupyter노트북 에서 발생합니다 %matplotlib inline. savefig통화는 플롯 생성 방법과 동일한 셀에 있어야합니다.
ijoseph

3
보고 흥미로운 plt.show()것은 새로운 이미지를 생성합니다. 실제로 이것은 문제를 해결했습니다.
user989762

흥미롭게도, plt.plot, plt.savefig, plt.show를 spyder와 같은 터미널에 하나씩 입력하면 그림이 표시되지 않습니다. 모든 명령을 스크립트에 넣고 한 번에 실행하십시오. 플롯을 보여줍니다.
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()모든 것을 지우므로 나중에 새로운 빈 그림에서 발생합니다.
luckydonald

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.