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

Matplotlib에서 레이블 흐림 없이 플롯을 효과적으로 래스터화하는 방법


Matplotlib으로 만든 플롯을 PDF나 SVG 같은 벡터 형식으로 저장할 때 파일 크기가 지나치게 커지는 문제를 겪어본 적이 있다면, rasterized 옵션을 활용해 볼 수 있습니다. 이 옵션을 사용하면 그래픽 요소만 비트맵으로 변환되어 파일 크기를 크게 줄일 수 있으면서도, 텍스트 레이블은 벡터 방식으로 유지되어 확대해도 흐려지지 않고 선명함을 유지할 수 있습니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 패딩을 조정합니다.

  • Figure와 서브플롯 세트를 생성합니다.

  • 축 0 – alpha 값과 rasterized=False를 사용해 곡선 사이 영역을 채웁니다.

  • 축에 텍스트를 추가합니다.

  • 축 1 – alpha 값과 rasterized=True를 사용해 곡선 사이 영역을 채웁니다.

  • 축에 텍스트를 추가합니다.

  • 축 2와 3 – alpha 없이 각각 rasterized=Truerasterized=False로 곡선 사이 영역을 채웁니다.

  • 축에 텍스트를 추가합니다.

  • show() 메서드를 호출해 그림을 화면에 표시합니다.

예제 코드

import matplotlib.pyplot as plt
import numpy as np

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

fig, axes = plt.subplots(nrows=4, sharex=True)

axes[0].fill_between(np.arange(1, 10), 1, 2, zorder=-1, alpha=0.2, rasterized=False)
axes[0].text(5, 1.5, "Label 1", ha='center', va='center', fontsize=25, zorder=-2, rasterized=True)

axes[1].fill_between(np.arange(1, 10), 1, 2, zorder=-1, alpha=0.2, rasterized=True)
axes[1].text(5, 1.5, "Label 2", ha='center', va='center', fontsize=25, zorder=-2, rasterized=True)

axes[2].fill_between(np.arange(1, 10), 1, 2, zorder=-1, rasterized=True)
axes[2].text(5, 1.5, "Label 3", ha='center', va='center', fontsize=25, zorder=-2, rasterized=True)

axes[3].fill_between(np.arange(1, 10), 1, 2, zorder=-1, rasterized=False)
axes[3].text(5, 1.5, "Label 4", ha='center', va='center', fontsize=25, zorder=-2, rasterized=True)

plt.show()

출력 결과

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

Matplotlib에서 레이블 흐림 없이 플롯을 효과적으로 래스터화하는 방법

축 2와 3에는 alpha 값이 적용되지 않아 채우기 영역이 완전히 불투명하기 때문에, 그 아래에 위치한(zorder가 더 낮은) 레이블이 가려져 보이지 않는 것을 확인할 수 있습니다. 반면 축 0과 1처럼 alpha=0.2를 적용하면 반투명한 채우기 영역 너머로 레이블이 비쳐 보이게 됩니다.

핵심은 래스터화가 필요한 그래픽 요소에만 rasterized=True를 지정하고, 선명함이 중요한 텍스트나 좌표축 레이블은 기본 벡터 상태로 두는 것입니다. 이렇게 하면 파일 크기는 줄이면서도 레이블의 가독성은 그대로 유지할 수 있습니다. 또한 저장 시 dpi 값을 조절하면 래스터화된 요소의 해상도를 원하는 수준으로 높일 수 있습니다.