Matplotlib-고해상도 그래프를 그리는 방법?


87

몇 가지 실험 결과를 플로팅하기 위해 matplotlib를 사용했습니다 (여기에서 논의 : 파일 반복 및 플로팅 . 그러나 이미지를 오른쪽 클릭하여 사진을 저장하면 매우 나쁜 품질 / 저해상도 이미지를 얻을 수 있습니다.

from glob import glob
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# loop over all files in the current directory ending with .txt
for fname in glob("./*.txt"):
    # read file, skip header (1 line) and unpack into 3 variables
    WL, ABS, T = np.genfromtxt(fname, skip_header=1, unpack=True)

    # first plot
    plt.plot(WL, T, label='BN', color='blue')

    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylim(0,100)
    plt.ylabel('Transmittance, %')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend(loc='lower center')
    plt.title('')
    plt.show()
    plt.clf()


    # second plot
    plt.plot(WL, ABS, label='BN', color='red')
    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylabel('Absorbance, A')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend()
    plt.title('')
    plt.show()
    plt.clf()

내가 찾고있는 그래프의 예 : 예제 그래프

답변:


125

를 사용 savefig()하여 이미지 파일로 내보낼 수 있습니다 .

plt.savefig('filename.png')

또한 다음 dpi과 같이 일부 스칼라 값에 인수를 지정할 수 있습니다 .

plt.savefig('filename.png', dpi=300)

그런 파일 이름을 지정할 수 없습니다. 스크립트는 'fname in glob ( "./*. txt")'의 파일을 검색합니다.
esilik

당신이 원하는대로 파일 전화
오핫 Eytan

데이터를 덮어 쓰고 두 개의 사진 만 제공합니다. 그렇지 않습니까? 내 목표는 각 텍스트 파일에 대해 두 개의 그래프를 얻는 것입니다.
esilik

당신은 같은 것을 할 수 있도록 plt.savefig(fname + 'Graph1.png')하고plt.savefig(fname + 'Graph2.png')
오핫 Eytan

큰! 첫 번째 그래프의 경우 plt.savefig (fname + 'Graph1a.png', dpi = 600), 두 번째 그래프의 경우 plt.savefig (fname + 'Graph1a.png', dpi = 600)가 문제를 해결했습니다. 감사!
esilik

35

plt.figure(dpi=1200)모든 사용 전에 plt.plot...그리고 마지막 사용을 plt.savefig(...참조하십시오 : http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figurehttp://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig


@deepfriedcyanide는 " savefig의 파일 이름 인수는 문자열 일 뿐이므로 다음과 같이 할 수 있습니다. plt.savefig ( 'folder / file % d.png'% n) with an that you count up 각 음모 후에. "하지만 아직 아이디어를 얻지 못했습니다. 이 코드를 스크립트에 어디에 어떻게 넣어야합니까?
esilik

1
이것은 나를 위해 일했습니다! 지금 내 플롯 4K XD에
곤살로 가르시아

23

무손실 품질을 위해 그래프를 svg로 저장할 수 있습니다.

import matplotlib.pylab as plt

x = range(10)

plt.figure()
plt.plot(x,x)
plt.savefig("graph.svg")

5
plt.savefig("graph.pdf")또한 무손실 PDF로 저장할 수도 있습니다
Danny

6

나처럼 matplotlib에서 고해상도 이미지를 저장하려고 시도 하면서이 질문을 찾은 미래의 독자를 위해 위와 다른 곳에서 몇 가지 답변을 시도하고 여기에 요약했습니다.

최상의 결과 :plt.savefig('filename.pdf')

그런 다음 명령 줄에서이 pdf를 png로 변환하여 PowerPoint에서 사용할 수 있습니다.

pdftoppm -png -r 300 filename.pdf filename

또는 단순히 pdf를 열고 Adobe에서 필요한 이미지로 자르고 PNG로 저장하고 사진을 PowerPoint로 가져옵니다.

덜 성공적인 테스트 # 1 :plt.savefig('filename.png', dpi=300)

이렇게하면 이미지가 일반 해상도보다 약간 더 높게 저장되지만 출판이나 일부 프레젠테이션에는 충분히 높지 않습니다. 최대 2000 dpi 값을 사용하면 가까이에서 볼 때 여전히 흐릿한 이미지가 생성됩니다.

덜 성공적인 테스트 # 2 :plt.savefig('filename.pdf')

이것은 Microsoft Office Professional Plus 2016에서 열 수 없으므로 Google Slides와 동일합니다.

덜 성공적인 테스트 # 3 :plt.savefig('filename.svg')

위와 동일한 문제로 인해 PowerPoint 또는 Google Slides에서도 열 수 없습니다.

덜 성공적인 테스트 # 4 :plt.savefig('filename.pdf')

그런 다음 명령 줄에서 png로 변환합니다.

convert -density 300 filename.pdf filename.png

그러나 이것은 가까이에서 볼 때 여전히 너무 흐릿합니다.

덜 성공적인 테스트 # 5 :plt.savefig('filename.pdf')

김프에서 열고 고품질 png로 내보내기 (파일 크기가 ~ 100KB에서 ~ 75MB로 증가)

덜 성공적인 테스트 # 6 :plt.savefig('filename.pdf')

그런 다음 명령 줄에서 jpeg로 변환합니다.

pdfimages -j filename.pdf filename

이것은 오류를 생성하지 않았지만 여러 매개 변수를 변경 한 후에도 Ubuntu에서 출력을 생성하지 않았습니다.


1
.pdf나에게도 최고의 품질이었습니다. 거의 완벽한 품질이 4k처럼 완전히 확대되었습니다. 명령 줄에서 변환하는 대신 .pdf의 스크린 샷을 찍어 png로 저장하면 충분합니다.
데이비드 에릭슨

2

그래프 저장 :

matplotlib.rcParams['savefig.dpi'] = 300

다음을 사용할 때 그래프 표시 plt.show():

matplotlib.rcParams["figure.dpi"] = 100

상단에 추가하기 만하면됩니다.


0

for () 루프 의 끝에서 plt.show ()savefig() 대신 함수를 사용 하고 그림의 이름, dpi 및 형식을 설정할 수 있습니다.

예를 들어 1000dpi 및 eps 형식은 상당히 좋은 품질이며 모든 사진을 ./ 폴더에 'Sample1.eps', 'Sample2.eps'등의 이름 으로 저장 하려면 다음 코드를 추가하면됩니다.

for fname in glob("./*.txt"):
    # Your previous code goes here
    [...]

    plt.savefig("./{}.eps".format(fname), bbox_inches='tight', format='eps', dpi=1000)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.