Skip to content

Matplotlib savefig 레이블 잘림 해결: 완전한 2025 가이드

Updated on

tight_layout, constrained_layout, bbox_inches, rcParams 및 최신 모범 사례를 포함해 Matplotlib savefig에서 레이블이 잘리는 문제를 완전히 해결하는 최신 가이드입니다.

노트북에서 볼 때는 완벽해 보이던 Matplotlib 플롯이 savefig()로 저장하니 잘리거나(clipped), 일부 레이블이 사라진 상태로 나와 본 적이 있다면, 혼자가 아닙니다.

이는 특히 다음과 같이 사용할 때 자주 발생하는 대표적인 Matplotlib 스트레스 요인입니다.

  • 키가 큰 LaTeX 렌더링 레이블
  • 여러 줄로 이루어진 제목
  • 회전된 또는 너무 긴 눈금 레이블
  • 간격이 촘촘한 서브플롯

이 업데이트된 가이드에서는, 저장된 그림에 항상 레이블·제목·주석이 온전히 포함되도록 하는 모든 신뢰할 수 있는 방법을, 2025년 기준 최신 모범 사례와 함께 정리합니다.


🧠 왜 이런 문제가 생길까?

Matplotlib은 레이블이 축 밖으로 튀어나가더라도 그에 맞게 figure 캔버스를 자동으로 확장하지 않습니다.
대표적인 원인은 다음과 같습니다.

  • 세로로 긴 기호를 포함한 LaTeX 스타일 수식
  • fontsize
  • 길거나 회전된 눈금 레이블
  • 빽빽한 서브플롯 그리드

예시:

matplotlib-savefig-label-clipping-example

import matplotlib.pyplot as plt
 
plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$', fontsize=50)
plt.title('Example with matplotlib 3.4.2\nLabel clipping example')
plt.show()

ylabel은 보이지만, 저장한 그림에서는 xlabel잘려 나가는 경우가 많습니다.


✅ 1. 최신 권장 해결책: constrained_layout=True 사용 (추천)

Matplotlib 3.6+ (2025년 기준 3.8+에서도 동일)에서는 다음 레이아웃 방식이 공식 추천입니다.

fig, ax = plt.subplots(constrained_layout=True)

예시:

matplotlib-constrained-layout-example.png

fig, ax = plt.subplots(figsize=(7, 5), constrained_layout=True)
ax.set_xlabel("Very long bottom label that usually gets clipped", fontsize=16)
ax.set_ylabel("Tall math label:\n$\\frac{x_a - x_b}{x_c}$")
fig.savefig("figure.png")

✔ 장점

  • 최신 방식이며 안정적
  • tight_layout()보다 동작이 개선됨
  • colorbar, legend, 여러 서브플롯과 함께 사용해도 성능이 좋음

⚠ 단점

  • 서브플롯이 매우 많은 큰 그리드에서는 약간 느릴 수 있음

2025년에 새로 Matplotlib 코드를 작성한다면, 이 방법을 기본값으로 사용하는 것을 권장합니다.


✅ 2. subplots_adjust로 여백을 수동 조정

여전히 간단하면서도 효과적인 방식입니다.

plt.subplots_adjust(bottom=0.15)

또는 figure 객체에 대해:

plt.gcf().subplots_adjust(bottom=0.18)

레이블이 겹치지 않을 때까지 margin 값을 점점 키워가며 조정하면 됩니다.

matplotlib-subplots-adjust-margins.png


✅ 3. tight_layout() 사용 (구식이지만 여전히 유용)

tight_layout()은 패딩을 자동으로 조정해 줍니다.

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
for ax in axes.flatten():
    ax.set_xlabel("Example X label")
    ax.set_ylabel("Example Y label")
 
plt.tight_layout()
plt.show()

참고 사항

  • 단순한 플롯에 좋음
  • legend, colorbar가 많을 경우 레이아웃이 꼬일 수 있음
  • 현재는 constrained_layout=True가 더 권장되는 방법

✅ 4. 저장 시 bbox_inches="tight" 사용 (빠른 응급처치)

레이블 잘림에 널리 쓰이는 해결책입니다.

plt.savefig("myfile.png", bbox_inches="tight")

언제 쓰면 좋은가?

  • 레이아웃 코드를 건드리지 않고 빠르게 문제를 해결하고 싶을 때
  • 화면에 보이는 내용이 그대로 파일에도 들어가도록 보장하고 싶을 때

matplotlib-tight-layout-subplots.png


✅ 5. rcParams로 자동 레이아웃 활성화

모든 플롯에 공통으로 적용되는 영구적인 기본 설정을 원한다면:

matplotlib-bbox-inches-tight-example.png

런타임에 rcParams 업데이트:

from matplotlib import rcParams
rcParams.update({"figure.autolayout": True})

또는 matplotlibrc 설정 파일에 추가:

figure.autolayout : True

이렇게 하면 팀원이나 다른 머신에서도 일관된 출력 결과를 얻는 데 도움이 됩니다.


📌 요약 표: 어떤 방법을 언제 써야 할까?

Method언제 사용할까어떤 경우에 가장 적합한가
constrained_layout=True2025년 기준 기본 선택최신 레이아웃, 서브플롯, legend 포함
bbox_inches='tight'저장할 때 빠르게 문제를 해결하고 싶을 때단일 플롯 내보내기
tight_layout()기존(레거시) 코드 유지 보수 시단순한 서브플롯 그리드
subplots_adjust()완전한 수동 제어가 필요할 때출판용 미세 튜닝
figure.autolayout=True프로젝트 전체의 기본 설정으로 쓸 때환경·시스템 간 결과 일관성 유지

💡 완성도 높은 Figure를 위한 추가 팁

✔ 긴 레이블이 있을 때는 DPI를 높여 저장

plt.savefig("fig.png", dpi=200, bbox_inches="tight")

✔ 꼭 필요하지 않다면 지나치게 큰 글꼴 크기는 피하기

글꼴이 커질수록 잘림 가능성이 커집니다.

✔ colorbar가 있을 때는 constrained_layout 사용

tight_layout보다 colorbar 처리 성능이 확실히 좋습니다.


📊 수동 레이아웃 조정 없이 시각화 만들기 (PyGWalker)

DataFrame 시각화 목적이라면, Matplotlib에서 일일이 레이아웃을 손보지 않아도 될 수 있습니다.

단순히:

  • DataFrame을 로드하고
  • 필드를 드래그 앤 드롭한 뒤
  • 바로 차트를 생성

하는 식으로 사용할 수 있습니다.

이때 활용할 수 있는 오픈소스 시각화 도구가 PyGWalker입니다.

PyGWalker for Data visualization (opens in a new tab)

사용 방법은 간단합니다.

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

또는 온라인에서 바로 사용해 볼 수도 있습니다.

KaggleGoogle ColabGitHub

❓ 자주 묻는 질문 (FAQ)

  1. Matplotlib에서 figure를 savefig로 저장하면 레이블이 잘리는 이유는 무엇인가요?
    레이블이 축 영역 바깥으로 나가도 Matplotlib이 자동으로 캔버스 크기를 늘려 주지 않기 때문입니다. LaTeX 레이블, 회전된 텍스트, 큰 글꼴 등을 사용할 때 특히 자주 발생합니다.

  2. 2025년 기준으로 레이블 잘림을 가장 안정적으로 해결하는 방법은 무엇인가요?
    새로운 코드에는 constrained_layout=True를 사용하는 것이 가장 좋고, 내보내기 단계에서 빠르게 처리하려면 bbox_inches='tight'를 함께 사용하는 방식을 추천합니다.

  3. bbox_inches="tight"는 정확히 무엇을 하나요?
    저장 시 figure의 bounding box를 다시 계산해, 모든 텍스트 요소(레이블, 제목, 주석 등)가 잘리지 않고 포함되도록 보장해 줍니다.