HOWTO · Matplotlib

Matplotlib에서 서브플롯 사이의 간격을 변경하는 방법

tight_layout(), subplots_adjust(), subplot_tool() 또는 constrained_layout=True를 사용하여 서브 플롯이 많은 Matplotlib 그림의 간격을 개선합니다.

이 페이지의 내용

서브플롯이 많은 Matplotlib 그림을 더 읽기 쉽게 만들려면 작업 방식에 맞는 레이아웃 제어 방법을 선택하세요. tight_layout()을 호출해 서브플롯 장식을 자동으로 맞추거나, plt.subplots_adjust()로 간격과 그림 여백을 설정하거나, plt.subplot_tool()을 열어 대화형으로 조정하거나, 서브플롯을 만들 때 constrained_layout=True를 활성화할 수 있습니다. 이 방법들은 레이아웃을 조정합니다. 각 축에 더 넓은 공간이 필요하다면 그림 크기를 키우거나 행과 열의 수를 바꾸는 것도 고려하세요.

tight_layout()으로 서브플롯 겹침 방지

그래프, 레이블, 제목을 추가한 다음 fig.tight_layout()을 호출하세요. 축 레이블이나 제목 같은 장식이 들어갈 공간을 확보하도록 서브플롯 위치를 조정합니다. 기본 배치가 복잡할 때 먼저 시도해 보기 좋은 방법이지만, 특히 장식이 복잡한 그림에서는 모든 레이아웃 문제를 해결하지 못할 수 있습니다.

다음 완전한 예제는 2×2 격자에 제목이 있는 그래프 네 개를 만든 뒤 자동으로 배치를 조정합니다. 변경하지 않은 코드에 표시되는 그래프 제목은 “Sine function”, “Cosine function” 등 영어로 되어 있습니다.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 100)
series = [
    (np.sin(x), "Sine function"),
    (np.cos(x), "Cosine function"),
    (1 / (1 + np.exp(-x)), "Sigmoid function"),
    (np.exp(x), "Exponential function"),
]

fig, axes = plt.subplots(2, 2)
for ax, (values, title) in zip(axes.flat, series):
    ax.plot(x, values)
    ax.set_title(title)

fig.tight_layout()
plt.show()

예제를 실행하려면 NumPy와 Matplotlib이 설치된 Python 환경을 사용하세요. 제목과 데이터 그래프를 추가한 뒤 레이아웃을 조정합니다.

plt.subplots_adjust()로 서브플롯 간격과 여백 설정

축 사이의 간격이나 격자 바깥 여백을 직접 조정하려면 plt.subplots_adjust()를 사용하세요. wspace는 평균 축 너비를 기준으로 한 가로 간격의 비율을 설정하고, hspace는 평균 축 높이를 기준으로 한 세로 간격의 비율을 설정합니다. left, right, bottom, top 값은 그림의 너비 또는 높이에 대한 비율로 서브플롯 영역의 가장자리를 정합니다.

다음 예제는 동일한 그래프 네 개의 배치를 사용하면서 행 사이의 간격을 넓힙니다.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 100)
series = [
    (np.sin(x), "Sine function"),
    (np.cos(x), "Cosine function"),
    (1 / (1 + np.exp(-x)), "Sigmoid function"),
    (np.exp(x), "Exponential function"),
]

fig, axes = plt.subplots(2, 2)
for ax, (values, title) in zip(axes.flat, series):
    ax.plot(x, values)
    ax.set_title(title)

fig.subplots_adjust(left=0.12, right=0.95, bottom=0.12, top=0.9, wspace=0.25, hspace=0.4)
plt.show()

해당 간격을 넓히려면 wspace 또는 hspace 값을 높이세요. 예를 들어 레이블에 여유 공간이 더 필요할 때는 네 가장자리 값을 조정해 서브플롯 격자 주변의 공간을 확보할 수 있습니다. 이 설정은 그림 안의 축 배치를 제어합니다. 그림 전체에 더 넓은 공간이 필요하면 plt.subplots()의 figsize를 변경하세요.

plt.subplot_tool()로 서브플롯 레이아웃을 대화형으로 조정

plt.subplot_tool()은 서브플롯 간격과 여백을 조정하는 컨트롤이 있는 Matplotlib 창을 엽니다. 그림을 보며 레이아웃을 맞춘 뒤 선택한 설정을 스크립트에 옮기고 싶을 때 유용합니다. 이 도구를 사용하려면 대화형 Matplotlib 백엔드와 그래픽 환경이 필요합니다. 정적 이미지나 헤드리스 플로팅 세션의 레이아웃을 조정하는 방법은 아닙니다.

GUI를 사용하는 대화형 세션에서 그림을 만든 뒤 해당 그림을 인수로 plt.subplot_tool(fig)를 호출하세요. 이 호출은 연결된 툴바가 있는 Matplotlib 캔버스 관리자에 의존합니다. 헤드리스 렌더링에 사용하는 백엔드 같은 비대화형 백엔드에는 이 툴바가 없으므로 도구를 실행할 수 없습니다. 따라서 대화형 예제는 헤드리스 환경에서 실행할 스크립트로 제시하지 않습니다.

그림을 보면서 도구의 컨트롤을 사용해 서브플롯 매개변수를 바꾸세요. 배치가 적절해지면 반복 가능한 결과를 얻을 수 있도록 해당 wspace, hspace, 여백 값을 코드의 plt.subplots_adjust()에 적용하세요.

서브플롯 생성 시 constrained_layout=True 활성화

그림을 그리는 동안 공간을 자동으로 배치하려면 plt.subplots()를 호출할 때 constrained_layout=True를 전달하세요. 레이아웃 엔진은 제목과 레이블 같은 서브플롯 장식을 고려합니다. 그림을 만들 때 이 옵션을 활성화하세요. 이 옵션은 그림을 그리는 동안 레이아웃을 관리하도록 설계되었지만, 장식이 복잡하면 수동 조정이 여전히 필요할 수 있습니다. 자세한 내용은 Matplotlib constrained layout 가이드를 참조하세요.

import numpy as np
import matplotlib.pyplot as plt

a = np.linspace(0, 5, 100)
figure, axes = plt.subplots(2, 2, constrained_layout=True)

axes[0, 0].plot(a, np.exp(a))
axes[0, 1].plot(a, np.sin(a))
axes[1, 0].plot(a, np.cos(a))
axes[1, 1].plot(a, a ** 2)

for index, ax in enumerate(axes.flat, start=1):
    ax.set_title(f"Subplot {index}")

plt.show()

네 가지 방법은 모두 서브플롯 레이아웃 관리에 도움이 되지만, 용도는 서로 다릅니다. 콘텐츠를 추가한 뒤 빠르게 자동 배치하려면 tight_layout()을, 값을 직접 지정하려면 plt.subplots_adjust()를, 대화형으로 조정하려면 plt.subplot_tool()을 사용하세요. 그림을 만들 때 간격을 자동으로 관리하려면 constrained_layout=True를 활성화하세요.