Skip to content

Matplotlib 축 눈금과 포매터: 읽기 쉬운 스케일 만들기

Updated on

눈금이 겹치고 날짜가 눌러붙고 숫자가 지저분하면 흐름이 보이지 않습니다. 눈금 위치(Locator)와 표시 방식(Formatter)을 직접 정하면 축이 정돈되고 메시지가 분명해집니다.

Locator vs Formatter 한눈에 보기

작업도구예시
일정 간격 배치MultipleLocatorx를 5 단위
최대 본수 제한MaxNLocatory를 최대 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)) 설정.