일반적인 히스토그램은 각 빈(bin)의 폭이 동일하지만, 데이터 분포에 따라 각 막대의 면적이 같아지도록 빈 경계를 조정해야 하는 경우가 있습니다. Matplotlib에서는 사용자 정의 함수로 빈 경계를 직접 계산하여 이러한 히스토그램을 손쉽게 그릴 수 있습니다.
구현 단계
그림 크기를 설정하고 서브플롯 사이 및 주변의 여백을 조정합니다.
NumPy를 사용하여 무작위 데이터 포인트를 생성합니다.
각 패치(막대)의 면적이 동일해지도록 빈 경계를 계산하는 equal_area 메서드를 활용해 히스토그램을 그립니다.
show() 메서드를 호출하여 그림을 화면에 표시합니다.
예제 코드
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
def equal_area(x, nbin):
pow = 0.5
dx = np.diff(np.sort(x))
tmp = np.cumsum(dx ** pow)
tmp = np.pad(tmp, (1, 0), 'constant')
return np.interp(np.linspace(0, tmp.max(), nbin + 1), tmp, np.sort(x))
x = np.random.randn(1000)
n, bins, patches = plt.hist(x, equal_area(x, 20), edgecolor='black')
plt.show()
코드 설명
equal_area 함수는 먼저 데이터를 오름차순으로 정렬한 뒤, 인접한 값들 사이의 차이(np.diff)에 0.5제곱을 적용하고 그 누적합을 계산합니다. 이 누적합 곡선 위에서 nbin + 1개의 균등한 지점으로 보간(np.interp)하면 빈 경계값들이 반환됩니다. 이렇게 하면 데이터가 밀집된 구간에서는 빈 폭이 좁아지고 희소한 구간에서는 넓어지므로, 결과적으로 모든 막대의 면적이 동일해집니다.
실행 결과
위 코드를 실행하면 각 막대의 면적이 같은 히스토그램이 다음과 같이 출력됩니다.
