[python] Matplotlib를 사용하여 플롯을 이미지 파일로 표시하지 않고 이미지 파일로 저장

나는 플롯을 즉시 생성하기 위해 빠르고 더러운 스크립트를 작성하고 있습니다. Matplotlib 설명서의 아래 코드를 시작점으로 사용하고 있습니다.

from pylab import figure, axes, pie, title, show

# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]

explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})

show()  # Actually, don't show, just save to foo.png

GUI에 플롯을 표시하고 싶지 않고 대신 플롯을 파일 (foo.png)로 저장하여 배치 스크립트에서 사용할 수 있습니다. 어떻게합니까?



답변

질문에 대한 답변이 있지만 matplotlib.pyplot.savefig 사용할 때 유용한 팁을 추가하고 싶습니다 . 파일 형식은 확장자로 지정할 수 있습니다.

from matplotlib import pyplot as plt

plt.savefig('foo.png')
plt.savefig('foo.pdf')

래스터 화 된 또는 벡터화 된 출력을 각각 제공 할 수 있습니다. 또한 pylab이미지 주위에 관대하고 종종 바람직하지 않은 공백이 남는 것을 알 수 있습니다. 다음으로 제거하십시오.

savefig('foo.png', bbox_inches='tight')


답변

다른 사람이 말했다, 한 plt.savefig()또는 fig1.savefig()참으로 이미지를 저장하는 방법입니다.

그러나 어떤 경우 에는 항상 그림이 표시 됩니다. (예 plt.ion(): Spyder with 대화 형 모드 = 켜기) 나는 거대한 루프에서 그림 창을 강제로 닫아서이 문제를 해결 하므로 plt.close(figure_object)( 문서 참조 ) 루프 중에 백만 개의 열린 인물이 없습니다.

import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 )  # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png')   # save the figure to file
plt.close(fig)    # close the figure window

필요한 경우 나중에 그림을 다시 열 수 있어야합니다 fig.show()(자신을 테스트하지 않았습니다).


답변

해결책은 다음과 같습니다.

pylab.savefig('foo.png')


답변

이 문제를 해결하기 위해 MatPlotLib 설명서에서이 링크를 찾았습니다.
http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

그들은 그림이 팝업되는 것을 막는 가장 쉬운 방법은 다음과 같이 비대화 형 백엔드 (예 : Agg)를 사용하는 것입니다 matplotib.use(<backend>).

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')

plt.close( fig )루프를 사용하는 동안 특정 그림을 숨길 수있는 옵션이 있지만 여전히 루프 후 데이터 처리를 위해 그림을 표시하기 때문에 개인적으로을 선호합니다 . 비록 비대화 형 백엔드를 선택하는 것보다 느릴 것입니다. 누군가 그것을 테스트하면 흥미로울 것입니다.

업데이트 : Spyder의 경우 일반적으로 이러한 방식으로 백엔드를 설정할 수 없습니다 (Spyder는 일반적으로 matplotlib를 일찍로드하여을 사용하지 못하기 때문에 matplotlib.use()).

대신 Spyder prefs에서 plt.switch_backend('Agg')enable support “를 사용 하거나 끄고 matplotlib.use('Agg')직접 명령을 실행하십시오.

이 두 힌트에서 : 하나 ,


답변

“현재”그림의 개념이 마음에 들지 않으면 다음을 수행하십시오.

import matplotlib.image as mpimg

img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)


답변

다른 답변은 맞습니다. 그러나 때때로 그림 개체 를 열고 싶다는 것을 알게 되었습니다. 예를 들어, 레이블 크기를 변경하거나 그리드를 추가하거나 다른 처리를 원할 수 있습니다. 완벽한 세상에서 나는 줄거리를 생성하는 코드를 다시 실행하고 설정을 조정합니다. 아아, 세상은 완벽하지 않다. 따라서 PDF 또는 PNG로 저장하는 것 외에도 다음을 추가합니다.

with open('some_file.pkl', "wb") as fp:
    pickle.dump(fig, fp, protocol=4)

이처럼 나중에 그림 개체를로드하고 원하는대로 설정을 조작 할 수 있습니다.

또한 스택의 locals()각 함수 / 방법에 대한 소스 코드와 사전을 사용하여 스택을 작성하여 나중에 그림을 생성 한 대상을 정확하게 알 수 있습니다.

주의 : 때때로이 방법은 큰 파일을 생성하므로주의하십시오.


답변

import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt

# Create the PdfPages object to which we will save the pages:
# The with statement makes sure that the PdfPages object is closed properly at
# the end of the block, even if an Exception occurs.
with PdfPages('multipage_pdf.pdf') as pdf:
    plt.figure(figsize=(3, 3))
    plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
    plt.title('Page One')
    pdf.savefig()  # saves the current figure into a pdf page
    plt.close()

    plt.rc('text', usetex=True)
    plt.figure(figsize=(8, 6))
    x = np.arange(0, 5, 0.1)
    plt.plot(x, np.sin(x), 'b-')
    plt.title('Page Two')
    pdf.savefig()
    plt.close()

    plt.rc('text', usetex=False)
    fig = plt.figure(figsize=(4, 5))
    plt.plot(x, x*x, 'ko')
    plt.title('Page Three')
    pdf.savefig(fig)  # or you can pass a Figure object to pdf.savefig
    plt.close()

    # We can also set the file's metadata via the PdfPages object:
    d = pdf.infodict()
    d['Title'] = 'Multipage PDF Example'
    d['Author'] = u'Jouni K. Sepp\xe4nen'
    d['Subject'] = 'How to create a multipage pdf file and set its metadata'
    d['Keywords'] = 'PdfPages multipage keywords author title subject'
    d['CreationDate'] = datetime.datetime(2009, 11, 13)
    d['ModDate'] = datetime.datetime.today()