데이터 분포를 한눈에 파악할 수 있는 상자 그림(Box Plot)과 개별 데이터 포인트까지 시각화할 수 있는 스웜 플롯(Swarm Plot)을 하나의 그래프에 겹쳐 그리면, 요약 통계와 실제 데이터 분포를 동시에 확인할 수 있어 매우 유용합니다.
Seaborn 라이브러리를 사용하여 스웜 플롯 위에 상자 그림을 오버레이하는 방법을 단계별로 알아보겠습니다.
구현 단계
- 그림 크기 설정: figure 크기를 지정하고 서브플롯 사이 및 주변 여백(padding)을 자동으로 조정합니다.
- 데이터 준비: 2차원 표 형태의 가변 크기 데이터 구조인 Pandas 데이터프레임을 생성합니다.
- 스웜 플롯 초기화:
sns.swarmplot()메서드로 개별 데이터 포인트를 먼저 그립니다. - 상자 그림 추가: 같은 축(ax)에
sns.boxplot()메서드를 호출하여 상자 그림을 겹쳐 그립니다. - 결과 출력:
plt.show()메서드로 최종 그림을 화면에 표시합니다.
예제 코드
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 그림 크기 및 레이아웃 설정
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
# 샘플 데이터 생성
data = pd.DataFrame({"Box1": np.arange(10), "Box2": np.arange(10)})
# 스웜 플롯 먼저 그리기 (zorder=0으로 맨 아래 배치)
ax = sns.swarmplot(x="Box1", y="Box2", data=data, zorder=0)
# 같은 축에 상자 그림 오버레이 (투명한 박스, 캡·이상치·수염 선 제거)
sns.boxplot(x="Box1", y="Box2", data=data, showcaps=False,
boxprops={'facecolor': 'None'},
showfliers=False,
whiskerprops={'linewidth': 0}, ax=ax)
plt.show()핵심 포인트
위 예제에서 중요한 부분은 boxplot() 메서드의 스타일 옵션입니다:
showcaps=False— 수염 끝의 캡 선을 숨깁니다.boxprops={'facecolor': 'None'}— 상자 내부를 투명하게 만들어 아래의 스웜 포인트가 보이도록 합니다.showfliers=False— 이상치 마커를 표시하지 않습니다.whiskerprops={'linewidth': 0}— 수염 선의 두께를 0으로 설정해 숨깁니다.
또한 스웜 플롯을 먼저 그리고 zorder=0으로 지정한 후 상자 그림을 나중에 덧그리는 순서가 중요합니다. 이렇게 하면 상자 그림의 중앙값 선과 사분위수 경계가 데이터 포인트 위에 깔끔하게 표시되어, 분포의 요약 정보와 개별 관측값을 함께 파악할 수 있습니다.