데이터 위에 의미를 얹는 도구는 ax.annotate(화살표가 있는 주석), ax.text(단순 텍스트), 그리고 axhline/axvline/axhspan/axvspan(기준선·기준 구간)입니다.
텍스트 위치는 좌표계(데이터 좌표 vs Axes 비율 좌표)를 무엇으로 잡느냐가 핵심이며, transform 인자로 지정합니다.
수식은 달러 기호로 감싼 mathtext로 쓰고, 한글은 폰트 설정(font.family)과 axes.unicode_minus=False를 지정하지 않으면 깨지거나 마이너스 기호가 사라집니다.
import matplotlib.pyplot as plt
import numpy as npax.annotate -화살표 주석특정 데이터 지점을 가리키며 설명을 답니다.
x = np.linspace(0, 10, 100)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
peak = x[np.argmax(y)]
ax.annotate(
"first peak",
xy=(peak, 1.0), # 가리킬 지점 (데이터 좌표)
xytext=(peak + 1.5, 0.5), # 글자 위치 (데이터 좌표)
arrowprops=dict(arrowstyle="->", color="gray"),
fontsize=10,
)xy는 화살표 끝(가리키는 곳), xytext는 글자가 놓이는 곳입니다.xycoords/textcoords로 좌표계를 바꿉니다. 기본은 "data"(데이터 좌표), "axes fraction"은 Axes 기준 0~1 비율.arrowprops 없이 쓰면 화살표 없는 텍스트가 됩니다.💡 이럴 때: "이 그림에서 봐야 할 곳"이 분명하면 제목에 결론을 쓰고(
ax.set_title("Q3에 매출이 정점")) 해당 지점에annotate로 화살표를 답니다. 독자가 스스로 찾게 두지 않습니다. → 데이터 전처리·시각화 이론 학습 로드맵 2.11
ax.text -좌표계와 transformax.text(0.5, 5, "data-space label") # 데이터 좌표
ax.text(0.02, 0.95, "top-left corner", transform=ax.transAxes,
va="top", ha="left") # Axes 비율 좌표ha(가로 정렬: left/center/right), va(세로 정렬: top/center/bottom)로 기준점을 잡습니다.bbox=dict(boxstyle="round", fc="white", ec="gray", alpha=0.8).ax.axhline(y=0, color="black", linewidth=0.8) # 수평선 (y=0 기준선)
ax.axvline(x=pd_launch_date, color="C3", linestyle="--", label="출시일")
ax.axhspan(90, 100, color="green", alpha=0.1) # 수평 띠 (목표 구간)
ax.axvspan("2026-03", "2026-05", color="gray", alpha=0.15) # 수직 띠 (특정 기간)axhline/axvline은 축 전체를 가로지르는 선, axhspan/axvspan은 범위를 채운 띠입니다.xmin/xmax를 0~1 비율로).💡 이럴 때: 임계치(SLA 99%, 손익분기점)나 사건 발생 시점(배포, 정책 변경)을
axhline/axvline으로 표시하면 데이터가 그 기준을 넘었는지 즉시 읽힙니다.
ax.set_xlabel(r"$\lambda$ (wavelength, nm)")
ax.set_title(r"$E = mc^2$, $\sum_{i=1}^{n} x_i$")
ax.text(0.5, 0.5, r"$\bar{x} \pm \sigma$", transform=ax.transAxes)$...$ 안이 수식으로 렌더링됩니다. 문자열 앞에 r(raw string)을 붙여 백슬래시가 이스케이프되지 않게 합니다.text.usetex=True(시스템에 LaTeX 필요).논의 계층을 분리합니다. 한글 깨짐은 ① 폰트 지정 문제와 ② 마이너스 기호 문제가 별개로 겹칩니다.
import matplotlib.pyplot as plt
# ① 한글 폰트 지정 (설치된 폰트 이름을 사용)
plt.rcParams["font.family"] = "Malgun Gothic" # Windows
# plt.rcParams["font.family"] = "AppleGothic" # macOS
# plt.rcParams["font.family"] = "NanumGothic" # Linux (나눔폰트 설치 후)
# ② 유니코드 마이너스(−)를 ASCII 하이픈(-)으로 → 축의 음수가 □로 깨지는 것 방지
plt.rcParams["axes.unicode_minus"] = Falsematplotlib.font_manager._load_fontmanager(try_read_cache=False) 또는 캐시 파일 삭제 후 재시작.from matplotlib import font_manager
[f.name for f in font_manager.fontManager.ttflist if "Gothic" in f.name or "Nanum" in f.name]ax.set_title("제목", fontproperties=font_manager.FontProperties(fname="C:/Windows/Fonts/malgun.ttf")).💡 이럴 때: 축 라벨의 한글은 나오는데 음수 눈금이
□2,□4로 보이면 폰트가 아니라axes.unicode_minus문제입니다.False로 지정합니다.
💡 이럴 때: 협업 환경(CI, 동료 PC)에서 폰트 이름이 제각각이면, 폰트 파일을 리포지토리에 포함하고 font_manager.fontManager.addfont(path) 후 font.family에 그 폰트 이름을 지정해 환경 독립적으로 만듭니다.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.