데이터 분석에서 상자 그림(boxplot)은 데이터의 분포를 한눈에 파악할 수 있는 유용한 시각화 도구입니다. 그런데 하나의 축(axis)에 여러 개의 상자 그림을 함께 그릴 경우, 각 그룹이 무엇을 의미하는지 구분하기 어려울 수 있습니다. 이럴 때 범례(legend)를 추가하면 가독성이 크게 향상됩니다.
Matplotlib에서 동일한 축에 여러 상자 그림을 그리고 각각에 대한 범례를 추가하려면 다음 단계를 따르면 됩니다.
구현 단계
- 그림 크기 설정: figure 크기를 지정하고, 서브플롯 사이 및 주변의 패딩(padding)을 조정합니다.
- 랜덤 데이터 생성: NumPy를 사용하여 임의의 데이터 a와 b를 생성합니다.
- 피겨 생성: figure() 메서드를 사용해 새 피겨를 만들거나 기존 피겨를 활성화합니다.
- 축 추가: add_subplot()으로 현재 피겨에 축(axes)을 서브플롯 형태로 추가합니다.
- 상자 그림 그리기: boxplot() 메서드를 사용하여 서로 다른 면 색상(facecolor)을 가진 상자 수염 그림을 그립니다. 이때 patch_artist=True 옵션을 지정해야 상자 내부에 색상을 채울 수 있습니다.
- 범례 추가: 두 상자 그림 객체인 bp1과 bp2의 박스 아티스트를 legend() 메서드에 전달하고, 범례 항목에 순서대로 레이블을 지정합니다.
- 그래프 표시: show() 메서드를 호출하여 최종 그림을 화면에 출력합니다.
예제 코드
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
a = np.random.rand(100, 2)
b = np.random.rand(100, 2)
fig = plt.figure()
ax = fig.add_subplot(111)
bp1 = ax.boxplot(a, positions=[1, 3], notch=True, widths=0.35,
patch_artist=True, boxprops=dict(facecolor="C0"))
bp2 = ax.boxplot(b, positions=[0, 2], notch=True, widths=0.35,
patch_artist=True, boxprops=dict(facecolor="C2"))
ax.legend([bp1["boxes"][0], bp2["boxes"][0]],
["Box Plot 1", "Box Plot 2"], loc='upper right')
plt.show()코드 설명
위 예제에서는 positions 매개변수를 사용하여 두 상자 그림이 x축에서 서로 겹치지 않도록 위치를 조정했습니다. 첫 번째 상자 그림(bp1)은 파란색 계열(C0)로 1, 3번 위치에, 두 번째 상자 그림(bp2)은 초록색 계열(C2)로 0, 2번 위치에 배치됩니다.
범례를 만들 때 핵심은 bp1["boxes"][0]처럼 각 상자 그림의 박스 아티스트 중 하나를 전달하는 것입니다. 이렇게 하면 해당 색상의 상자가 범례 마커로 표시되어 어떤 색상이 어떤 데이터 그룹인지 쉽게 알 수 있습니다. loc='upper right' 옵션은 범례를 그래프의 오른쪽 위에 배치합니다.
실행 결과
위 코드를 실행하면 동일한 축에 두 개의 노치(notch) 상자 그림이 서로 다른 색상으로 표시되고, 오른쪽 위에 "Box Plot 1", "Box Plot 2"라는 범례가 나타납니다.