개요
Matplotlib에서 히스토그램을 그릴 때 각 구간(bin)의 막대에 서로 다른 색상을 적용하고, 색상별로 여러 개의 범례 항목을 함께 표시하고 싶은 경우가 있습니다. 이 글에서는 Rectangle 패치를 활용해 히스토그램에 다중 범례를 추가하는 방법을 단계별로 살펴봅니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백(padding)을 조정합니다.
- NumPy를 사용하여 무작위 데이터를 생성합니다.
- hist() 메서드로 히스토그램을 그립니다.
- 각 패치(patch)의 면 색상으로 사용할 색상 리스트를 준비합니다.
- 패치를 순회하며 각 패치의 면 색상을 설정합니다.
- 범례에 사용할 핸들(handles) 리스트를 생성합니다.
- legend() 메서드로 여러 범례 항목을 추가합니다.
- show() 메서드로 최종 그림을 화면에 표시합니다.
예제 코드
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Rectangle
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
data = np.random.rayleigh(size=1000) * 35
N, bins, patches = plt.hist(data, 30, ec="k")
colors = ["red", "yellow", "green"]
for i in range(0, len(bins)-1):
patches[i].set_facecolor(colors[i % len(colors)])
handles = [Rectangle((0, 0), 1, 1, color=c, ec="k") for c in colors]
labels = ["Red", "Yellow", "Green"]
plt.legend(handles, labels)
plt.show()코드 설명
np.random.rayleigh(size=1000) * 35는 레일리 분포를 따르는 1,000개의 무작위 데이터를 생성한 뒤 스케일을 35배로 확장합니다. plt.hist(data, 30, ec="k")는 데이터를 30개의 구간으로 나누어 히스토그램을 그리며, ec="k" 옵션으로 각 막대의 테두리를 검은색으로 지정합니다.
이때 반환되는 patches는 각 막대에 해당하는 패치 객체들의 리스트입니다. 반복문에서 i % len(colors)를 사용하면 빨강, 노랑, 초록 세 가지 색상이 구간을 따라 순환하며 적용됩니다.
범례에는 실제 히스토그램 막대 대신 Rectangle((0, 0), 1, 1, color=c, ec="k")로 만든 사각형 패치를 핸들로 전달합니다. 이렇게 하면 각 색상에 해당하는 깔끔한 색상 견본이 범례에 표시되고, labels 리스트의 라벨과 매칭되어 "Red", "Yellow", "Green" 세 개의 범례 항목이 나타납니다.
실행 결과
위 코드를 실행하면 레일리 분포 형태의 히스토그램이 그려지며, 왼쪽 영역은 빨간색, 중간 영역은 노란색, 오른쪽 꼬리 부분은 초록색으로 채워집니다. 그래프 상단에는 세 가지 색상에 대응하는 범례가 함께 표시되어 데이터 구간을 직관적으로 구분할 수 있습니다.