HOWTO · Matplotlib

Matplotlib의 플롯 내부에 텍스트 추가

이 튜토리얼에서는 `matplotlib.pyplot.text()` 함수를 사용하여 Matplotlib Figure 또는 Axes에 텍스트를 추가하는 방법을 알아봅니다.

이 페이지의 내용

matplotlib.pyplot.text()를 사용하면 Matplotlib 플롯에서 원하는 위치에 레이블이나 메모를 넣을 수 있습니다. 이 함수에는 표시할 문자열과 함께 x 및 y 좌표를 전달하고, 선택적 인수로 텍스트 모양을 조정합니다. 예를 들어 plt.text(2, 20, "Peak point")는 데이터 좌표 (2, 20)에 레이블을 배치합니다. Axes 객체를 사용하는 경우 이에 해당하는 ax.text(2, 20, "Peak point")를 호출하면 됩니다. 전체 매개변수 목록은 pyplot.text() API 참고 문서를 확인하세요.

matplotlib.pyplot.text() 함수로 플롯에 텍스트 추가하기

다음 예제는 선을 그린 뒤 데이터 점 하나에 레이블을 배치합니다. pyplot 인터페이스를 사용하며, 지정한 좌표가 플롯에 표시되도록 표시 범위도 설정합니다.

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [10, 15, 25, 30]

plt.plot(x, y, marker="o")
plt.xlim(0, 5)
plt.ylim(0, 35)
plt.text(3, 25, "Peak point", fontsize=12, color="crimson")
plt.title("A labeled line plot")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

x와 y에는 플롯에 그릴 데이터가 들어 있고, 함수 호출은 좌표 (3, 25)에 “Peak point”를 배치합니다. 두 개의 축 범위 설정 호출은 해당 좌표가 표시 범위에 들어오게 합니다. 여러 플롯을 만드는 스크립트에서는 ax.text(x, y, label)을 사용하면 텍스트를 특정 Axes에 연결해 어느 플롯에 표시되는지 분명히 할 수 있습니다. pyplot 호출은 현재 플롯 하나를 다룰 때 편리합니다. 예제에 표시된 “Peak point” 문자열은 영어이며, 필요에 따라 직접 바꿀 수 있습니다.

데이터 좌표와 축 범위로 텍스트 위치 지정하기

기본적으로 text()의 x 및 y 인수는 데이터 좌표를 사용합니다. 따라서 (3, 25)에 놓인 레이블은 그래프의 해당 값을 따르며, 모서리에서 몇 픽셀 떨어진 위치로 지정되는 것이 아닙니다. 현재 x 및 y 축 범위에 따라 데이터 좌표 평면 중 어느 부분이 보일지가 정해집니다. 지정한 위치가 이 범위 밖에 있으면 텍스트는 플롯의 표시 영역 밖에 놓입니다. plt.xlim() 및 plt.ylim()으로 적절한 범위를 설정하거나, Axes 객체에서 ax.set_xlim() 및 ax.set_ylim()을 사용할 수 있습니다.

레이블이 읽기 쉽고 중요한 데이터를 가리지 않는 위치를 선택하세요. 데이터 값과 관계없이 Axes 내의 일정한 비율 위치에 메모를 고정하려면 transform=ax.transAxes를 통해 Axes 좌표를 사용합니다. (0, 0)은 Axes의 왼쪽 아래, (1, 1)은 오른쪽 위를 뜻합니다. 이는 기본 데이터 좌표와 다르며 플롯 안에 고정해 둘 캡션을 배치할 때 유용합니다.

텍스트 모양 사용자 지정하기

text()에 키워드 인수를 전달해 레이블의 스타일을 지정할 수 있습니다. fontsize는 글자 크기를, color는 글자색을 바꾸고, fontweight="bold"는 글자를 강조합니다. rotation으로 텍스트를 회전하고, horizontalalignment(또는 ha) 및 verticalalignment(또는 va)로 x와 y 좌표를 기준으로 정렬합니다. 예를 들어 ha="center"와 va="bottom"을 지정하면 레이블이 점 위쪽에 놓이면서 해당 점을 기준으로 가운데 정렬됩니다.

bbox 인수는 텍스트 뒤에 배경을 추가해 복잡한 선이나 마커와 레이블을 구분하는 데 도움을 줍니다. 이 인수에는 패치 속성을 담은 딕셔너리를 전달합니다. 다음의 간단한 예제는 정렬, 강조, 회전, 반투명한 흰색 상자를 함께 사용합니다.

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

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 3], marker="o")
ax.text(2, 4, "Peak", fontsize=12, color="crimson", fontweight="bold",
        ha="center", va="bottom", rotation=15,
        bbox={"facecolor": "white", "alpha": 0.8})
plt.close(fig)

예를 들어 bbox={"facecolor": "white", "alpha": 0.8}은 부분적으로 투명한 흰색 배경을 만듭니다. 가독성을 높이는 옵션만 사용하세요. 강한 색상, 큰 글꼴 또는 회전을 널리 적용하면 데이터보다 텍스트가 두드러질 수 있습니다.

주석과 여러 줄 텍스트 추가하기

특정 요소를 가리키는 메모가 필요하면 plt.annotate()를 사용합니다. xy 인수는 설명할 데이터 점을 지정하고, xytext는 텍스트 위치를 지정합니다. 예를 들어 plt.annotate("Peak", xy=(3, 25), xytext=(2, 30), arrowprops={"arrowstyle": "->"})는 점 위에 메모를 놓고 그 점을 향하는 화살표를 그립니다. 주석 텍스트의 위치도 기본적으로 데이터 좌표를 사용하므로, 대상 점과 메모가 모두 포함되도록 축 범위를 설정하세요. Axes를 사용하는 경우 ax.annotate()를 호출하면 대상과 메모가 원하는 플롯에 연결됩니다.

여러 줄로 된 메모를 표시하려면 text()에 전달하는 문자열에 "First line\nSecond line"처럼 줄바꿈 문자를 넣습니다. Matplotlib은 각 문자열 부분을 지정한 위치에서 별도의 줄로 표시합니다. 여러 줄 레이블은 간결한 설명을 덧붙일 때 유용합니다. 표시 영역 안에 머물고 주변 데이터를 가리지 않도록 위치와 정렬을 조정하세요. 이 방법들을 사용하면 레이블, 맥락 설명, 가리키는 화살표를 추가하면서 각 메모를 해당 좌표나 설명 대상 요소에 연결할 수 있습니다. 예제에 표시된 “Peak”, “First line”, “Second line” 문자열은 영어이며, 필요에 따라 직접 바꿀 수 있습니다.