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