HOWTO · Matplotlib

Matplotlib에서 플롯 바깥에 범례 배치하기

bbox_to_anchor와 loc를 사용해 Matplotlib 범례를 좌표축 바깥에 배치하고, 저장한 그림에서 잘리지 않게 하는 방법을 알아봅니다.

이 페이지의 내용

Matplotlib 범례를 좌표축 바깥에 배치하려면 bbox_to_anchor와 loc를 함께 사용합니다. 예를 들어 ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))는 범례의 왼쪽 위 모서리를 좌표축 오른쪽 위 경계 바로 바깥의 기준점에 맞춥니다. 기본 좌표계에서 (0, 0)은 좌표축의 왼쪽 아래, (1, 1)은 오른쪽 위입니다.

bbox_to_anchor 사용 예제

두 값으로 이루어진 bbox_to_anchor를 사용하면 범례를 좌표축 바로 바깥에 둘 수 있습니다. Axes.legend에서 이 쌍은 좌표축 좌표계의 기준점이며, loc는 범례에서 기준점에 맞출 모서리를 지정합니다. 다음 예제는 레이블이 있는 두 곡선을 그리고 범례가 놓일 공간을 그림에 확보합니다.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
fig.subplots_adjust(right=0.78)
plt.close(fig)

Matplotlib Legend bbox_to_anchor Example

위치를 더 세밀하게 지정하려면 bbox_to_anchor에 (x0, y0, width, height) 네 값을 전달할 수도 있습니다. 이 값은 범례 자체의 크기가 아니라 기준이 되는 상자를 정의합니다. (x0, y0)은 상자의 왼쪽 아래 모서리이고, width와 height는 좌표축 좌표계에서 상자의 너비와 높이입니다. loc는 범례의 어느 지점을 상자의 대응 지점에 맞출지 선택합니다. 예를 들어 loc="upper left"는 범례의 왼쪽 위 모서리를 기준 상자의 왼쪽 위 모서리에 맞춥니다. 자주 쓰는 문자열 값으로는 "upper right", "lower left", "center", "best"가 있습니다. Matplotlib은 숫자 코드도 지원하며, 0은 "best", 10은 "center"에 해당합니다.

tight_layout()은 레이블이나 제목 같은 좌표축 장식에 맞춰 서브플롯 매개변수를 조정합니다. 모든 레이아웃에서 좌표축 바깥의 범례 공간까지 확실히 확보해 주는 것은 아닙니다. 화면에 범례를 보이게 하려면 fig.subplots_adjust(right=...)로 공간을 남기거나 좌표축과 범례가 함께 들어가는 레이아웃을 선택하세요. 첫 번째 이미지는 바깥에 배치한 범례를 보여 주고, 잘린 결과 이미지는 범례를 위한 공간이 그림에 없을 때 생길 수 있는 상황을 보여 줍니다.

Matplotlib Legend bbox_to_anchor Cropped

bbox_extra_artists와 bbox_inches로 저장 이미지에서 범례 잘림 방지하기

그림을 저장할 때 바깥쪽 범례를 bbox_extra_artists에 전달하고 bbox_inches="tight"로 설정하세요. 그러면 저장 작업에서 그림의 타이트한 경계 상자를 계산할 때 범례도 고려하므로, 내보낸 이미지에 범례가 포함됩니다. 다음 예제는 정상적으로 실행되어 임시 디렉터리에 PNG 파일을 씁니다. 표준 출력과 오류 출력은 발생하지 않습니다.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory

x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
legend = ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))

with TemporaryDirectory() as directory:
    output_path = Path(directory) / "example.png"
    fig.savefig(
        output_path,
        dpi=300,
        format="png",
        bbox_extra_artists=(legend,),
        bbox_inches="tight",
    )

plt.close(fig)

bbox_extra_artists에는 Matplotlib이 타이트한 경계 상자를 계산할 때 포함할 Artist를 지정합니다. bbox_inches="tight"는 savefig가 계산된 경계 상자를 저장 이미지에 사용하도록 합니다. 이 옵션들은 저장할 때 잘리는 문제를 해결하지만, 좌표축 안에서 범례의 위치나 크기를 바꾸지는 않습니다.

저장 예제는 종료 코드 0으로 완료되었으며 표준 출력과 오류 출력은 모두 비어 있어 화면에 표시되는 출력은 없습니다.