Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib 히스토그램에 여러 범례 항목 추가하기

개요

Matplotlib에서 히스토그램을 그릴 때 각 구간(bin)의 막대에 서로 다른 색상을 적용하고, 색상별로 여러 개의 범례 항목을 함께 표시하고 싶은 경우가 있습니다. 이 글에서는 Rectangle 패치를 활용해 히스토그램에 다중 범례를 추가하는 방법을 단계별로 살펴봅니다.

구현 단계

  1. 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백(padding)을 조정합니다.
  2. NumPy를 사용하여 무작위 데이터를 생성합니다.
  3. hist() 메서드로 히스토그램을 그립니다.
  4. 각 패치(patch)의 면 색상으로 사용할 색상 리스트를 준비합니다.
  5. 패치를 순회하며 각 패치의 면 색상을 설정합니다.
  6. 범례에 사용할 핸들(handles) 리스트를 생성합니다.
  7. legend() 메서드로 여러 범례 항목을 추가합니다.
  8. 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" 세 개의 범례 항목이 나타납니다.

실행 결과

위 코드를 실행하면 레일리 분포 형태의 히스토그램이 그려지며, 왼쪽 영역은 빨간색, 중간 영역은 노란색, 오른쪽 꼬리 부분은 초록색으로 채워집니다. 그래프 상단에는 세 가지 색상에 대응하는 범례가 함께 표시되어 데이터 구간을 직관적으로 구분할 수 있습니다.