Skip to content

Matplotlib의 savefig 레이블이 잘려 나가는 문제 해결: 포괄적인 가이드

Updated on

Matplotlib에서 완벽한 플롯을 만들기 위해 몇 시간을 소비했는데, savefig 함수를 사용해 저장하려고 하면 레이블이 잘려 나가는 문제가 발생하는 경우가 있습니다. 특히 xlabel의 높이가 여러 줄의 텍스트와 같을 정도로 길어진 경우, 제대로 표시되지 않을 때가 많습니다. 하지만 걱정하지 마십시오. 본 문서에서는 Matplotlib의 savefig 함수가 레이블을 잘라내는 문제를 해결하는 여러 가지 방법을 살펴보겠습니다.

문제 이해

문제를 해결하기 전에 먼저 문제가 발생하는 이유를 이해해 보겠습니다. 과학적이거나 수학적인 플롯에서 복잡한 레이블을 사용하는 것이 일반적인데, 이들 레이블은 종종 TeX 수식으로 렌더링됩니다. 이러한 레이블은 "높은" 레이블일 수 있으며, 여러 줄에 걸쳐 표시되어 하단 레이블이 저장된 그림에서 잘려나는 경우가 있습니다. 다음은 이러한 경우의 예입니다.

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\nMRE no longer an issue')
plt.show()

이 예제에서는 ylabel이 표시되지만, xlabel이 하단에서 잘려나는 것을 볼 수 있습니다.

subplots_adjust 메서드

이러한 문제를 해결하는 일반적인 방법은 subplots_adjust 함수를 사용하여 플롯의 여백을 조정하는 것입니다. subplots_adjust 함수는 plt.gcf()를 통해 얻은 현재 피겨나 plt.subplots_adjust()를 직접 플롯에 적용할 수 있습니다. 다음은 사용 방법입니다.

plt.gcf().subplots_adjust(bottom=0.15)
# 또는
plt.subplots_adjust(bottom=0.15)

이 메서드는 xlabel의 공간을 위해 하단 여백을 조정합니다.

tight_layout 메서드

Matplotlib은 지정된 패딩을 제공하여 자동으로 서브플롯 매개변수를 조정하는 tight_layout 함수를 소개했습니다. 이 함수는 잘려 나간 레이블 문제에 대한 깔끔한 해결책을 제공합니다.

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
axes = axes.flatten()
 
for ax in axes:
    ax.set_ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
    ax.set_xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$')
 
plt.tight_layout()
plt.show()

plt.tight_layout()을 호출하여 Matplotlib은 서브플롯의 축을 자동으로 조정하여 레이블이 겹치거나 잘려 나가지 않도록 보장합니다.

bbox_inches='tight'을 이용한 그림 저장

그림을 저장할 때 라벨이 잘림을 방지하는 또 다른 방법은 savefig 함수에서 bbox_inches='tight'을 지정하는 것입니다:

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

이 옵션은 플롯의 모든 요소, 즉 라벨을 포함하여, 플롯이 저장될 때 경계 상자 내에 모든 요소가 맞도록 보장합니다.

다음 섹션에서는 피규어 자동 레이아웃 설정에 대해 자세히 알아보고 이전에 발생한 문제를 해결하는 방법을 살펴보겠습니다.

자동 레이아웃 조정

Matplotlib은 그림의 레이아웃을 자동으로 조정하는 옵션을 제공합니다. 이것은 코드를 다른 구성된 환경에서 실행해도 일관된 플롯을 생성하고 싶을 때 특히 유용합니다. 다음과 같이 설정할 수 있습니다:

실행 중인 rcParams 업데이트

실행 중에 rcParams를 업데이트할 수 있습니다. 이렇게 하면 코드가 실행될 때 자동 레이아웃 조정 설정이 활성화될 수 있습니다. 다음은 그 방법입니다:

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

Matplotlibrc 파일 구성

또 다른 방법으로, matplotlibrc 파일에서 자동 레이아웃 조정을 직접 설정할 수 있습니다:

figure.autolayout : True

이 설정은 기계 및 환경에 따라 일관된 플롯을 보장하는 훌륭한 방법입니다.

이제 Matplotlib의 savefig 함수에서 라벨이 잘리는 문제를 해결하는 방법에 대해 잘 이해하고 있어야합니다. 기억해야 할 것은 이러한 방법 중에서 가장 좋은 해결책은 특정 요구 사항과 상황에 따라 다르므로 여러 방법을 실험하여 최상의 방법을 찾아보는 것입니다.

Matplotlib 대안: PyGWalker를 사용하여 데이터 시각화

Pandas 데이터프레임을 시각화하는 데 Matplotlib을 사용하는 것 외에도, 여기에는 쉽게 데이터 시각화를 만들 수있는 오픈 소스 Python 라이브러리인 PyGWalker (opens in a new tab)가 있습니다.

PyGWalker for Data visualization (opens in a new tab)

더 이상 복잡한 Python 코딩으로 처리를 완료 할 필요가 없습니다. 데이터를 가져와 변수를 끌어서 놓기 만 하면 모든 종류의 데이터 시각화를 만들 수 있습니다! 작업에 대한 빠른 데모 비디오는 다음과 같습니다:


Jupyter Notebook에서 PyGWalker를 사용하는 방법은 다음과 같습니다:

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

또는 Kaggle 노트북/ Google Colab에서도 사용해볼 수 있습니다.

Kaggle 노트북에서 PyGWalker 실행하기 (opens in a new tab)Google Colab에서 PyGWalker 실행하기 (opens in a new tab)GitHub에서 PyGWalker에 ⭐️ 주기 (opens in a new tab)
Kaggle 노트북에서 PyGWalker 실행하기 (opens in a new tab)Google Colab에서 PyGWalker 실행하기 (opens in a new tab)GitHub에서 PyGWalker에 ⭐️ 주기 (opens in a new tab)

PyGWalker는 오픈 소스 커뮤니티의 지원을 받아 제작되었습니다. PyGWalker GitHub (opens in a new tab)을 방문하시면 ⭐️을 주는 것도 잊지 마세요!

자주 물어보는 질문

  1. Matplotlib의 savefig 함수를 사용할 때 레이블이 잘리는 이유는 무엇인가요? 이는 레이블이 "높은" 경우, 즉 TeX 공식을 사용하여 여러 줄에 걸쳐 렌더링되는 경우에 자주 발생합니다. 이때 Matplotlib는 그림 여백을 자동으로 조정하지 않으므로 레이블이 잘려 나타납니다.

  2. Matplotlib에서 tight_layout 함수는 무엇인가요? tight_layout 함수는 자동으로 서브플롯 매개변수를 조정하여 지정된 패딩을 제공하는 Matplotlib의 기능입니다. 이를 사용하면 레이블이 겹치거나 잘릴 수 없도록 보장할 수 있습니다.

  3. savefig 함수에서 bbox_inches='tight'는 무엇을 하는 것인가요? savefig 함수에서 bbox_inches='tight' 옵션은 그림을 저장할 때 레이블을 포함한 모든 요소가 바운딩 박스 내에 맞도록 보장합니다. 이렇게 함으로써 저장된 도표에서 레이블이 잘리는 것을 방지할 수 있습니다.