Matplotlib에서 산점도의 여러 지점에 주석(텍스트)을 추가하려면 annotate() 메서드를 반복문과 함께 활용하면 됩니다. 아래에서 단계별로 자세히 살펴보겠습니다.
구현 단계
- 그림 크기를 설정하고 서브플롯 사이와 주변의 여백(padding)을 조정합니다.
- NumPy를 사용하여 x, y 데이터 포인트를 생성합니다.
- 각 산점도 포인트에 표시할 라벨 목록을 만듭니다.
- scatter() 메서드로 xpoints, ypoints를 플롯하고, 색상은 xpoints 값을 기준으로 지정합니다.
- zip() 함수를 사용해 라벨, xpoints, ypoints를 하나씩 순회합니다.
- for 루프 안에서 annotate() 메서드를 호출하며, 굵은 글씨의 LaTeX 표현식으로 주석을 작성합니다.
- show() 메서드로 그림을 화면에 출력합니다.
예제 코드
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
xpoints = np.linspace(1, 10, 10)
ypoints = np.random.rand(10)
labels = ["%.2f" % i for i in xpoints]
plt.scatter(xpoints, ypoints, c=xpoints)
for label, x, y in zip(labels, xpoints, ypoints):
plt.annotate(
f"$\\bf{label}$",
xy=(x, y), xytext=(-20, 20),
textcoords='offset points', ha='center', va='bottom',
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0'))
plt.show()코드 설명
위 코드의 핵심 부분을 살펴보면 다음과 같습니다.
- xpoints = np.linspace(1, 10, 10): 1부터 10까지 균등한 간격으로 10개의 x 좌표를 생성합니다.
- ypoints = np.random.rand(10): 0과 1 사이의 난수 10개를 y 좌표로 생성합니다.
- labels: 각 x 좌표를 소수점 둘째 자리까지 문자열로 변환한 라벨 리스트입니다.
- f"$\\bf{label}$": LaTeX 수식 형식을 사용해 주석 텍스트를 굵게(bold) 표시합니다.
- xytext=(-20, 20): 주석 텍스트가 해당 포인트에서 왼쪽으로 20포인트, 위로 20포인트 떨어진 위치에 배치됩니다.
- arrowprops: '->' 스타일의 화살표로 포인트와 주석을 연결합니다.
실행 결과
코드를 실행하면 색상이 그라데이션으로 적용된 산점도가 그려지고, 각 데이터 포인트마다 굵은 글씨의 라벨이 화살표와 함께 표시된 그림이 출력됩니다. 이 방식을 응용하면 실제 데이터 시각화에서 특정 값이나 이상치를 강조하는 등 다양하게 활용할 수 있습니다.