질문자 :Homunculus Reticulli
나는 즉석에서 플롯을 생성하기 위해 빠르고 더러운 스크립트를 작성하고 있습니다. 시작점으로 아래 코드( 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
은 이미지 주위에 넉넉하고 종종 바람직하지 않은 공백을 남깁니다. 다음을 사용하여 공백을 제거할 수 있습니다.
plt.savefig('foo.png', bbox_inches='tight')
Hooked다른 사람들이 말했듯이 plt.savefig()
또는 fig1.savefig()
는 실제로 이미지를 저장하는 방법입니다.
그러나 어떤 경우에는 그림이 항상 표시 된다는 것을 알았습니다. (예: Spyder가 plt.ion()
: Interactive mode = On을 사용하는 경우) 저는 이 문제를 해결하기 위해 plt.close(figure_object)
하여 거대한 루프에서 Figure 창을 강제로 닫습니다(문서 참조). 루프 동안 백만 개의 열린 숫자가 있습니다.
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()
를 사용하여 나중에 그림을 다시 열 수 있어야 합니다(나 자신을 테스트하지 않음).
Demis솔루션은 다음과 같습니다.
pylab.savefig('foo.png')
Lukasz Czerwinski이 문제를 정확히 다루는 MatPlotLib 문서에서 이 링크를 찾았습니다. http://matplotlib.org/faq/howto_faq.html#generate-images-without-have-a-window-appear
그들은 그림이 팝업되는 것을 방지하는 가장 쉬운 방법은 matplotib.use(<backend>)
를 통해 비대화형 백엔드(예: Agg)를 사용하는 것이라고 말합니다. 예:
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()
).
대신 plt.switch_backend('Agg')
를 사용하거나 Spyder 환경 설정에서 " 지원 활성화 matplotlib.use('Agg')
명령을 직접 실행하십시오.
이 두 가지 힌트에서: 하나 , 둘
Demis"현재" 그림의 개념이 마음에 들지 않으면 다음을 수행하십시오.
import matplotlib.image as mpimg img = mpimg.imread("src.png") mpimg.imsave("out.png", img)
wonder.miceimport 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()
Victor Juliet다른 답변이 맞습니다. 그러나 나중에 그림 개체 를 열고 싶은 경우가 있습니다. 예를 들어 레이블 크기를 변경하거나 그리드를 추가하거나 다른 처리를 수행하고 싶을 수 있습니다. 완벽한 세계에서는 플롯을 생성하는 코드를 다시 실행하고 설정을 조정하기만 하면 됩니다. 아아, 세상은 완벽하지 않습니다. 따라서 PDF 또는 PNG로 저장하는 것 외에도 다음을 추가합니다.
with open('some_file.pkl', "wb") as fp: pickle.dump(fig, fp, protocol=4)
이와 같이 나중에 그림 개체를 로드하고 원하는 대로 설정을 조작할 수 있습니다.
또한 스택의 locals()
사전을 사용하여 스택을 작성하여 나중에 그림을 생성한 항목을 정확히 말할 수 있습니다.
주의: 때때로 이 방법은 거대한 파일을 생성하므로 주의하십시오.
gerritplot() 및 기타 함수를 사용하여 원하는 내용을 만든 후 다음과 같은 절을 사용하여 화면에 플로팅할지 파일에 플로팅할지 선택할 수 있습니다.
import matplotlib.pyplot as plt fig = plt.figure(figsize=(4, 5)) # size in inches # use plot(), etc. to create your plot. # Pick one of the following lines to uncomment # save_file = None # save_file = os.path.join(your_directory, your_file_name) if save_file: plt.savefig(save_file) plt.close(fig) else: plt.show()
Mark P.다음을 사용했습니다.
import matplotlib.pyplot as plt p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)") p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)") plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05), ncol=2, fancybox=True, shadow=True) plt.savefig('data.png') plt.show() f.close() plt.close()
그림을 저장한 후 plt.show를 사용하는 것이 매우 중요하다는 것을 알았습니다. 그렇지 않으면 작동하지 않습니다. png로 내보낸 그림
Cristian Muñoz저처럼 Spyder IDE를 사용하는 경우 다음을 사용하여 대화형 모드를 비활성화해야 합니다.
plt.ioff()
(이 명령은 과학 시작과 함께 자동으로 실행됩니다)
다시 활성화하려면 다음을 사용하십시오.
plt.ion()
Covich다음 중 하나를 수행할 수 있습니다.
plt.show(hold=False) plt.savefig('name.pdf')
GUI 플롯을 닫기 전에 savefig가 완료되도록 하는 것을 잊지 마십시오. 이렇게 하면 미리 이미지를 볼 수 있습니다.
plt.show()
하여 볼 수 있습니다. 그런 다음 GUI를 닫고 스크립트를 다시 실행합니다. 하지만 이번에는 plt.show()
를 plt.savefig()
바꾸십시오.
또는 다음을 사용할 수 있습니다.
fig, ax = plt.figure(nrows=1, ncols=1) plt.plot(...) plt.show() fig.savefig('out.pdf')
Nutcracker질문에 따르면 Matplotlib(pyplot) savefig는 빈 이미지를 출력합니다 .
한 가지 주의해야 할 점은 plt.show
를 사용하고 plt.savefig
다음에 사용해야 하는 경우, 그렇지 않으면 빈 이미지가 표시됩니다.
자세한 예:
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()
Jayhello해결책 :
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.style.use('ggplot') ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) ts = ts.cumsum() plt.figure() ts.plot() plt.savefig("foo.png", bbox_inches='tight')
이미지를 표시하고 이미지를 저장하려면 다음을 사용하십시오.
%matplotlib inline
import matplotlib
후
Durgesh satammatplotlib.pyplot
사용할 때 먼저 플롯을 저장한 다음 다음 두 줄을 사용하여 플롯을 닫아야 합니다.
fig.savefig('plot.png') # save the plot, place the path you want to save the figure in quotation plt.close(fig) # close the figure window
user11733125import matplotlib.pyplot as plt plt.savefig("image.png")
Jupyter 노트북에서 plt.show()
를 제거하고 plt.savefig()
나머지 plt 코드와 함께 하나의 셀에 추가해야 합니다. 이미지는 여전히 노트북에 표시됩니다.
Punnerud위의 항목에 추가하여 사진과 Python 파일이 같은 이름을 갖도록 이름 __file__
또한 더 보기 좋게 만들기 위해 몇 가지 인수를 추가했습니다.
# Saves a PNG file of the current graph to the folder and updates it every time # (nameOfimage, dpi=(sizeOfimage),Keeps_Labels_From_Disappearing) plt.savefig(__file__+".png",dpi=(250), bbox_inches='tight') # Hard coded name: './test.png'
r_e오늘날 많은 사람들이 Jupyter Notebook을 파이썬 콘솔로 사용한다는 점을 감안할 때(이 질문이 작성되었을 때는 사용할 수 없었음) 플롯을 .png
로 저장하는 매우 쉬운 방법이 있습니다. Jupyter Notebook에서 matplotlib
의 pylab
클래스를 호출하면 됩니다. 그림 '인라인' jupyter 셀을 선택한 다음 해당 그림/이미지를 로컬 디렉토리로 드래그합니다. 첫 번째 줄에 %matplotlib inline
을 잊지 마세요!
Shivid아직 게시물에 댓글을 달 수 없기 때문에 추가 참고 사항입니다.
plt.savefig('myfig')
또는 이러한 행을 따라 사용하는 경우 이미지가 저장된 후 plt.clf()
이는 savefig가 플롯을 닫지 않고 plt.clf()
없이 플롯에 추가하면 이전 플롯에 추가되기 때문입니다.
플롯이 이전 플롯 위에 플롯할 때와 유사한지 알아차리지 못할 수도 있지만 루프에 있는 경우 그림을 저장하면 플롯이 천천히 거대해지고 스크립트가 매우 느려집니다.
Woodyet이전에 제안한 대로 다음 중 하나를 사용할 수 있습니다.
import matplotlib.pyplot as plt plt.savefig("myfig.png")
표시하는 모든 IPython 이미지를 저장합니다. 또는 다른 관점에서(다른 각도에서 보면) 열린 이력서로 작업하게 되거나 열린 이력서를 가져온 경우 다음을 수행할 수 있습니다.
import cv2 cv2.imwrite("myfig.png",image)
그러나 이것은 Open CV로 작업해야 하는 경우를 위한 것입니다. 그렇지 않으면 plt.savefig()
로 충분해야 합니다.
Aditya Bhattacharya글쎄, 나는 플로팅을 렌더링하거나 제어하기 위해 래퍼를 사용하는 것이 좋습니다. 예는 mpltex( https://github.com/liuyxpp/mpltex ) 또는 prettyplotlib( https://github.com/olgabot/prettyplotlib )일 수 있습니다.
import mpltex @mpltex.acs_decorator def myplot(): plt.figure() plt.plot(x,y,'b-',lable='xxx') plt.tight_layout(pad=0.5) plt.savefig('xxxx') # the figure format was controlled by the decorator, it can be either eps, or pdf or png.... plt.close()
저는 기본적으로 이 데코레이터를 American Chemical Society, American Physics Society, American Opticcal Society American, Elsivier 등의 다양한 저널에 학술논문을 게재할 때 많이 사용합니다.
예는 다음 이미지( https://github.com/MarkMa1990/gradientDescent )에서 찾을 수 있습니다.
Mark확장자(png, jpg 등)와 원하는 해상도로 이미지를 저장할 수 있습니다. 다음은 피규어를 저장하는 기능입니다.
import os def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300): path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension) print("Saving figure", fig_id) if tight_layout: plt.tight_layout() plt.savefig(path, format=fig_extension, dpi=resolution)
'fig_id'는 피규어를 저장할 이름입니다. 도움이 되길 바랍니다 :)
Rudresh Dixit다음과 같이 할 수 있습니다.
def plotAFig(): plt.figure() plt.plot(x,y,'b-') plt.savefig("figurename.png") plt.close()
Mark아무것도 나를 위해 일하지 않았다. 문제는 저장된 이미지가 너무 작아서 도대체 어떻게 더 크게 만드는지 찾을 수 없다는 것입니다.
이것은 더 크게 만드는 것처럼 보이지만 여전히 전체 화면은 아닙니다.
https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure.set_size_inches
fig.set_size_inches((w, h))
그것이 누군가를 돕기를 바랍니다.
pedro rodriguez출처 : http:www.stackoverflow.com/questions/9622163/save-plot-to-image-file-instead-of-displaying-it-using-matplotlib