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


1150

나는 플롯을 즉시 생성하기 위해 빠르고 더러운 스크립트를 작성하고 있습니다. 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)로 저장하여 배치 스크립트에서 사용할 수 있습니다. 어떻게합니까?


84
답을 찾은 것 같습니다 : pylab.savefig ( 'foo.png')
Homunculus Reticulli

2
링크가 matplotlib.org 어딘가에 링크되어야합니까?
A.Wan

40
또한 pylab을 사용하지 않으면 Figure 객체에도 savefig메소드가 있습니다. 그래서 당신은 호출 할 수 있습니다 fig = plt.figure()fig.savefig(...).
A.Wan

27
많은 답변이 페이지 언급 plt.close(fig)을 낮추어 큰 루프에서 특히 중요합니다. 그렇지 않으면 수치는 열린 상태로 유지되고 메모리에서 대기 plt.show()
중이며

nb : matplotlib.pyplot 선호 : stackoverflow.com/questions/11469336/…
ErichBSchulz

답변:


1438

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

from matplotlib import pyplot as plt

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

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

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

9
결과 이미지의 크기를 변경할 수 있습니까?
Llamageddon

43
@Asmageddon plt.savefigdpi를 변경하려면 답변의 링크를 참조하십시오. 치수는 도면을 생성 할 때,보고 제어 할 수 figsizematplotlib.org/api/figure_api.html#matplotlib.figure.Figure
걸려

5
@MoTSCHIGGE 명령 plt.ioff()에서 대화 성을 비활성화 해야하는 전화 를 걸 수 있습니다 matplotlib.pyplot.
rubenvb

5
@STMohammed foo.png 경로입니다. 예를 들어 다음과 같은 디렉토리에 넣을 수 savefig("mydir/foo.png")있습니다.

3
bbox_inches = 'tight'는 매력처럼 작동합니다. 당신은 내 일했다
Catbuilts

205

다른 사람이 말했다, 한 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()(자신을 테스트하지 않았습니다).


9
을 설정할 plt.ioff() # turn of interactive plotting mode수도 있지만 코드에서 오류가 발생하면 사용하려는 동작이 비활성화 될 수 있습니다.
Demis

2
Jupyter 노트북에서도 동일한 문제가 발생합니다. plt.close(fig)해결
intsco


89

이 문제를 해결하기 위해 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')직접 명령을 실행하십시오.

이 두 힌트에서 : 하나 ,


1
이것은 디스플레이가 설정되어 있지 않은 상황에서 실제로 잘 작동합니다. 다른 백엔드를 사용하면 올바르게 설정되지 않은 .plot()경우 오류가 발생 os.environ['DISPLAY']합니다.
경제

1
감사. 이것은 인터넷 연결이없고 패키지를 설치하기 위해 시스템 관리자가 필요한 프로덕션 서버에 매우 유용합니다.
레온

matplotlib 사이트에서 "백엔드"에 대한 설명 / 정의에 대한 튜토리얼을 좋아합니다. matplotlib.org/tutorials/introductory/…
Tanner Strunk

47

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

import matplotlib.image as mpimg

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

2
이것만으로 복사 src.png하지 out.png않습니까?
gerrit

이미지 객체 ( img) 가 있는지 보여주는 예제 일뿐이며 .imsave()메소드를 사용 하여 파일에 저장할 수 있습니다 .
wonder.mice

4
@ wonder.mice는 현재 그림을 사용하지 않고 이미지를 만드는 방법을 보여줍니다.
scry

@ wonder.mice이 예제 덕분에 이미지 객체를 .png에 저장하는 방법을 보여준 첫 번째 예입니다.
Arthur Dent

@scry 항상 이미지를 만들 필요는 없습니다. 때로는 코드를 시험해보고 시각적 인 결과를 원할 때도 편리합니다.
Schütze 2019

29

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

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

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

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

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


jupyter 노트북에서 그림을 인라인으로 개발하는 것이 쉽지 않을까요? 이렇게하면 기록을 정확하게 추적하고 다시 실행할 수 있습니다.
Ciprian Tomoiagă

3
@CiprianTomoiaga 나는 대화 형 Python 쉘 (Jupyter 또는 기타)에서 생산 플롯을 생성하지 않습니다. 나는 모든 스크립트에서 음모를 꾸 plot 다.
gerrit

28
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()

28

plot () 및 기타 함수를 사용하여 원하는 내용을 만든 후 다음과 같은 절을 사용하여 화면 또는 파일에 플로팅 중에서 선택할 수 있습니다.

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()

일부 말 fig = plt.figure(figuresize=4, 5)fig = plt.figure(figsize=(4, 5)) #figure sizes in inches
사용자

24

나는 다음을 사용했다.

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로 내 보낸 도형


2
미안, 이거 뭐야? 플롯 된 이미지 파일? f= plt.savefig('data.png')
Morse

14

당신은 할 수 있습니다 :

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')

2
예기치 않은 키워드 인수 '보류'를 가지고
amitdatta

13

나와 같이 Spyder IDE를 사용하는 경우 다음을 사용하여 대화식 모드를 비활성화해야합니다.

plt.ioff()

(이 명령은 과학적 시작과 함께 자동으로 시작됩니다)

다시 활성화하려면 다음을 사용하십시오.

plt.ion()


12

해결책 :

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


9

질문 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()

여기에 이미지 설명을 입력하십시오


6
import matplotlib.pyplot as plt
plt.savefig("image.png")

Jupyter Notebook에서는 한 셀의 나머지 plt 코드와 함께을 제거 plt.show()하고 추가 해야합니다 plt.savefig(). 이미지는 여전히 노트북에 나타납니다.


1
"plt.show ()를 제거하십시오.".. 이것은 나의 하루를 구했습니다 ...
Guru

4

감안할 때 오늘 (이 질문이 이루어진 경우에 사용할 수없는) 많은 사람들이 같은 플롯을 저장하는 매우 쉬운 방법이, 파이썬 콘솔로 Jupyter 노트북을 사용하여 .png바로 전화 matplotlibpylab그림을 플롯 Jupyter 노트북에서 클래스 '인라인 'jupyter 셀을 찾은 다음 해당 그림 / 이미지를 로컬 디렉토리로 드래그하십시오. %matplotlib inline첫 줄을 잊지 마십시오 !


1
이미지가 노트북에 내장 된 경우 파일 크기에 미치는 영향을 기록하면됩니다.
prusswan

3

위의 것 외에도 __file__그림과 Python 파일의 이름이 동일하도록 이름을 추가했습니다. 또한 더 나아 보이도록 몇 가지 주장을 추가했습니다.

# 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'

2

를 사용할 때 matplotlib.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

1

이전에 제안했듯이 다음 중 하나를 사용할 수 있습니다.

import matplotlib.pyplot as plt
plt.savefig("myfig.png")

표시중인 IPhython 이미지를 저장합니다. 또는 다른 음으로 (다른 각도에서 보았을 때) 열린 cv로 작업하거나 열린 cv를 가져온 경우 다음을 수행 할 수 있습니다.

수입 cv2

cv2.imwrite ( "myfig.png", 이미지)

그러나 Open CV로 작업 해야하는 경우에 대비합니다. 그렇지 않으면 plt.savefig ()로 충분합니다.


0

확장명 (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'는 그림을 저장하려는 이름입니다. 그것이 도움이되기를 바랍니다 :)


0

다음과 같이 할 수 있습니다 :

def plotAFig():
  plt.figure()
  plt.plot(x,y,'b-')
  plt.savefig("figurename.png")
  plt.close()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.