Matplotlib를 사용하여 플롯을 이미지 파일로 표시하지 않고 이미지 파일로 저장 import figure, axes, pie, title, show #

나는 플롯을 즉시 생성하기 위해 빠르고 더러운 스크립트를 작성하고 있습니다. 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()