Matplotlib에서 월별 데이터를 다룰 때 각 막대의 너비를 데이터 간격에 맞게 조절하면 그래프가 훨씬 자연스러워집니다. 특히 날짜 축을 사용하는 경우, 막대가 서로 겹치거나 과도하게 떨어지지 않도록 너비를 직접 지정하는 것이 중요합니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백을 조정합니다.
- numpy와 datetime 모듈을 사용하여 날짜 리스트 x와 값 리스트 y를 만듭니다.
- 월별 데이터에 맞춰 x, y 데이터 포인트로 막대 그래프를 그립니다. 이때 인접한 날짜 간의 일수 차이를 계산해
width매개변수에 전달합니다. show()메서드를 호출하여 그래프를 화면에 표시합니다.
예제 코드
import numpy as np
import datetime
from matplotlib import pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
x = [datetime.datetime(2021, 1, 1, 0, 0),
datetime.datetime(2021, 2, 1, 0, 0),
datetime.datetime(2021, 3, 1, 0, 0),
]
y = np.cos(np.arange(3) * 2)
plt.bar(x, y, width=[(x[j+1]-x[j]).days for j in range(len(x)-1)] + [30])
plt.show()코드 설명
핵심은 width 매개변수에 리스트를 전달하는 부분입니다. 리스트 컴프리헨션 [(x[j+1]-x[j]).days for j in range(len(x)-1)]는 인접한 두 날짜 사이의 일수 차이를 계산합니다. 예를 들어 1월 1일과 2월 1일 사이는 31일이므로 첫 번째 막대의 너비가 31이 됩니다. 마지막 막대는 다음 데이터가 없기 때문에 기본값인 30일을 추가로 지정했습니다.
이렇게 하면 각 막대가 해당 월의 실제 길이에 비례하여 표시되므로, 시간 흐름에 따른 데이터 변화를 더 정확하게 시각화할 수 있습니다. 윤년처럼 월 길이가 다른 경우에도 자동으로 반영된다는 점이 이 방식의 장점입니다.
실행 결과
위 코드를 실행하면 세 개의 막대가 각각의 월 간격에 맞는 너비로 그려진 막대 그래프가 출력됩니다. 막대들이 날짜 축 위에서 균형 있게 배치되어 가독성이 크게 향상됩니다.