Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib에서 열려 있는 모든 그림을 한 번에 하나의 PDF 파일로 저장하는 방법


개요

Matplotlib로 데이터를 시각화하다 보면 여러 개의 그림(figure)을 동시에 띄워 놓고 작업하는 경우가 흔합니다. 이때 각 그림을 일일이 저장하는 것은 번거로운 작업입니다. 이 글에서는 PdfPages 클래스와 plt.get_fignums() 함수를 활용해 현재 열려 있는 모든 그림을 단 한 번의 실행으로 하나의 PDF 파일에 저장하는 방법을 알아보겠습니다.

구현 단계

  1. 그림 크기를 설정하고 서브플롯 주변과 사이의 패딩을 조정합니다.
  2. figure() 메서드를 사용해 새 그림(fig1)을 생성하거나 기존 그림을 활성화합니다.
  3. plot() 메서드로 첫 번째 선 그래프를 그립니다.
  4. figure() 메서드를 사용해 두 번째 그림(fig2)을 생성합니다.
  5. plot() 메서드로 두 번째 선 그래프를 그립니다.
  6. PDF 파일 이름을 담을 변수 filename을 초기화합니다.
  7. 사용자 정의 함수 save_multi_image를 작성한 뒤 호출하여, 열려 있는 모든 그림을 하나의 파일에 저장합니다. 이 함수 안에서 새로운 PdfPages 객체(pp)를 생성합니다.
  8. plt.get_fignums()로 현재 열려 있는 그림들의 번호 목록을 가져옵니다.
  9. 열려 있는 각 그림을 순회하면서 하나씩 파일에 저장합니다.
  10. 필요하다면 show() 메서드를 사용해 그림을 화면에 표시할 수도 있습니다.

예제 코드

from matplotlib import pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

fig1 = plt.figure()
plt.plot([2, 1, 7, 1, 2], color='red', lw=5)

fig2 = plt.figure()
plt.plot([3, 5, 1, 5, 3], color='green', lw=5)

def save_multi_image(filename):
    pp = PdfPages(filename)
    fig_nums = plt.get_fignums()
    figs = [plt.figure(n) for n in fig_nums]
    for fig in figs:
        fig.savefig(pp, format='pdf')
    pp.close()

filename = "multi.pdf"
save_multi_image(filename)

코드 설명

핵심은 save_multi_image 함수입니다. plt.get_fignums()는 현재 메모리에 존재하는 모든 그림의 고유 번호를 리스트로 반환합니다. 이 번호들을 이용해 각 그림 객체를 다시 불러온 뒤, fig.savefig()에 PdfPages 객체를 전달하면 그림들이 순서대로 PDF 페이지에 추가됩니다. 마지막으로 pp.close()를 호출해야 파일이 완전히 저장되므로 이 부분을 잊지 않도록 주의해야 합니다.

실행 결과

위 코드를 실행하면 빨간색 선과 초록색 선으로 그려진 두 개의 그래프가 프로젝트 디렉터리에 multi.pdf라는 이름의 단일 PDF 파일로 저장됩니다. PDF 뷰어로 파일을 열면 각 그림이 별도의 페이지로 들어가 있는 것을 확인할 수 있습니다.

Matplotlib에서 열려 있는 모든 그림을 한 번에 하나의 PDF 파일로 저장하는 방법Matplotlib에서 열려 있는 모든 그림을 한 번에 하나의 PDF 파일로 저장하는 방법