Matplotlib에서는 보조 눈금(minor tick) 위치에 레이블을 배치하고 가운데 정렬함으로써, 두 개의 주 눈금(major tick) 사이에 x축 레이블을 중앙에 배치할 수 있습니다. 예를 들어 월별 레이블을 각 달의 중간(15일)에 표시하면 연도 경계선 사이에 자연스럽게 정렬된 그래프를 만들 수 있습니다.
구현 단계
두 눈금 사이에 레이블을 배치하려면 다음 단계를 따르면 됩니다.
- 샘플 데이터(r)를 불러옵니다.
- 배열의 복사본을 만들고 지정된 타입으로 캐스팅합니다.
- subplots() 메서드를 사용하여 figure와 subplot 집합을 생성합니다.
- 날짜(date)와 r 샘플 데이터를 플롯합니다.
- set_major_locator() 및 set_minor_locator() 메서드로 주/보조 눈금의 로케이터(locator)를 설정합니다.
- set_major_formatter() 및 set_minor_formatter() 메서드로 주/보조 눈금의 포매터(formatter)를 설정합니다.
- 눈금 레이블을 중앙에 배치합니다.
- show() 메서드를 사용하여 그래프를 화면에 표시합니다.
예제 코드
import numpy as np
import matplotlib.cbook as cbook
import matplotlib.dates as dates
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
with cbook.get_sample_data('aapl.npz') as fh:
r = np.load(fh)['price_data'].view(np.recarray)
r = r[-250:]
date = r.date.astype('O')
fig, ax = plt.subplots()
ax.plot(date, r.adj_close)
ax.xaxis.set_major_locator(dates.MonthLocator())
ax.xaxis.set_minor_locator(dates.MonthLocator(bymonthday=15))
ax.xaxis.set_major_formatter(ticker.NullFormatter())
ax.xaxis.set_minor_formatter(dates.DateFormatter('%b'))
for tick in ax.xaxis.get_minor_ticks():
tick.tick1line.set_markersize(0)
tick.tick2line.set_markersize(0)
tick.label1.set_horizontalalignment('center')
imid = len(r) // 2
ax.set_xlabel(str(date[imid].year))
plt.show()코드 설명
위 코드의 핵심 동작은 다음과 같습니다.
- MonthLocator(): 매월 첫날에 주 눈금을 배치하지만, NullFormatter()를 사용해 주 눈금에는 아무 레이블도 표시하지 않습니다.
- MonthLocator(bymonthday=15): 매월 15일에 보조 눈금을 배치하고, DateFormatter('%b')로 월 이름(예: Jan, Feb)을 레이블로 표시합니다.
- 보조 눈금의 눈금선 길이를 0으로 설정하여 눈금 표시 없이 레이블만 남기고, set_horizontalalignment('center')로 레이블을 해당 위치의 중앙에 정렬합니다.
실행 결과
코드를 실행하면 각 월의 이름이 해당 달의 중간 지점(15일)에 위치한 보조 눈금을 기준으로 중앙 정렬되어 표시됩니다. 결과적으로 월 레이블이 두 개의 주 눈금(달의 시작점) 사이에 깔끔하게 중앙 배치된 시계열 그래프가 완성됩니다.