Matplotlib 축 눈금과 포매터: 읽기 쉬운 스케일 만들기
Updated on
눈금이 겹치고 날짜가 눌러붙고 숫자가 지저분하면 흐름이 보이지 않습니다. 눈금 위치(Locator)와 표시 방식(Formatter)을 직접 정하면 축이 정돈되고 메시지가 분명해집니다.
Locator vs Formatter 한눈에 보기
| 작업 | 도구 | 예시 |
|---|---|---|
| 일정 간격 배치 | MultipleLocator | x를 5 단위 |
| 최대 본수 제한 | MaxNLocator | y를 최대 6개 |
| 날짜 눈금 | AutoDateLocator | 월/연도 자동 |
| 커스텀 라벨 | FuncFormatter | 단위/접미사 추가 |
| 라벨 회전 | tick_params(rotation=...) | 빽빽한 날짜를 45° |
숫자 축: 간격과 라벨 제어
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FuncFormatter
import numpy as np
x = np.linspace(0, 50, 200)
y = np.log1p(x) * 3.2
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, y, color="tab:blue")
# x는 10 간격, y는 1.5 간격
ax.xaxis.set_major_locator(MultipleLocator(10))
ax.yaxis.set_major_locator(MultipleLocator(1.5))
# 단위가 포함된 라벨
ax.yaxis.set_major_formatter(FuncFormatter(lambda val, _: f"{val:.1f} dB"))
ax.set_xlabel("Samples")
ax.set_ylabel("Signal (dB)")
ax.grid(True, axis="both", linestyle="--", alpha=0.3)
plt.tight_layout()
plt.show()팁:
- 범위가 바뀌어도
MaxNLocator(nbins=6)이면 깔끔함을 유지. - Formatter는 위치를 바꾸지 않고 문자열만 바꾼다.
- 단위는 축 라벨 또는 Formatter 한쪽에만 넣어 중복을 피한다.
날짜 축: 겹침 방지
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
dates = pd.date_range("2024-01-01", periods=120, freq="D")
values = pd.Series(range(len(dates))).rolling(7, min_periods=1).mean()
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(dates, values, color="tab:green")
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
ax.xaxis.set_minor_locator(mdates.WeekdayLocator(byweekday=mdates.MO, interval=2))
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")
ax.set_ylabel("7-day avg")
ax.grid(True, which="both", axis="x", linestyle=":", alpha=0.4)
plt.tight_layout()
plt.show()팁:
- 마이너 눈금(예: 격주 월요일)으로 문맥은 주고 라벨은 줄인다.
- 날짜 라벨은 30–45° 회전과
ha="right"로 겹침을 막는다. - 기간이 자주 바뀌면
AutoDateLocator+ConciseDateFormatter를 사용해 자동 적응.
이중 축: 각 축별로 설정
twinx/secondary_yaxis에서는 축마다 Locator와 Formatter를 따로 설정해 색, 눈금, 단위를 일치시킨다. 범례 정렬은 세컨더리 축 가이드를 따른다.
빠른 체크리스트
- 눈금이 들쭉날쭉? 결정적 Locator(
MultipleLocator)를 지정. - 라벨이 잘림?
constrained_layout=True또는plt.tight_layout(). - 눈금이 너무 많음?
MaxNLocator(nbins=5)로 줄이거나 마이너 길이를 0으로 (ax.tick_params(which="minor", length=0)) 설정.