Matplotlib 박스플롯은 데이터를 간결하고 유익한 방식으로 시각화하는 강력한 도구입니다. 이 기사는 matplotlib을 사용하여 박스 플롯의 세계를 깊이 탐구하며, 이러한 다재다능한 시각화를 생성하고, 사용자 정의하고, 해석하는 다양한 측면을 살펴볼 것입니다. 데이터 과학자, 연구원 또는 분석가이든 관계없이 matplotlib 박스플롯을 마스터하면 복잡한 데이터 분포를 효과적으로 전달하는 능력이 향상될 것입니다.
Matplotlib 상자 그림 추천 기사
Matplotlib 박스플롯의 기초 이해하기
Matplotlib boxplot은 박스 및 수염 플롯을 생성하는 matplotlib 라이브러리 내의 함수입니다. 이러한 플롯은 데이터의 분포를 표시하는 데 탁월하며, 중앙값, 사분위수 및 잠재적 이상치와 같은 주요 통계 측정을 보여줍니다. matplotlib boxplot의 기본 사용법을 설명하기 위해 간단한 예제부터 시작해 보겠습니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
data = np.random.randn(100)
# 박스 플롯 생성
plt.figure(figsize=(8, 6))
plt.boxplot(data)
plt.title('기본 Matplotlib 박스 플롯 - how2matplotlib.com')
plt.ylabel('값')
plt.show()
출력:
이 예제에서는 무작위 데이터를 생성하고 matplotlib boxplot을 사용하여 기본 상자 그림을 만듭니다. 결과 플롯은 중앙값(중앙선), 사분위 범위(상자), 그리고 1.5배의 사분위 범위 내에서 최소값과 최대값까지 확장된 수염을 보여줍니다.
Matplotlib 박스플롯 외관 사용자 정의하기
Matplotlib boxplot은 박스 플롯의 외관을 사용자 정의할 수 있는 다양한 옵션을 제공합니다. 색상, 선 스타일 및 기타 시각적 요소를 조정하여 더 매력적이고 유익한 시각화를 만들 수 있습니다. 다음은 몇 가지 사용자 정의 옵션을 보여주는 예입니다:
import matplotlib.pyplot as plt
import numpy as np # 샘플 데이터 생성
data = [np.random.normal(0, std, 100) for std in range(1, 4)] # 맞춤형 박스 플롯 생성
fig, ax = plt.subplots(figsize=(10, 6))
bp = ax.boxplot(data, patch_artist=True)
# 색상 사용자 정의
colors = ['연한 파랑', '연한 초록', '연한 분홍']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
# 다른 요소 사용자 정의
plt.title('사용자 정의된 Matplotlib 박스플롯 - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
ax.set_xticklabels(['그룹 A', '그룹 B', '그룹 C'])
plt.show()
출력:
이 예제는 박스의 채우기 색상을 사용자 정의하고, x축의 레이블을 설정하며, matplotlib 박스플롯의 다른 시각적 요소를 조정하는 방법을 보여줍니다.
Matplotlib로 여러 개의 박스 플롯 만들기
Matplotlib boxplot은 여러 개의 박스 플롯을 나란히 생성할 수 있게 해주며, 이는 서로 다른 범주나 그룹 간의 분포를 비교하는 데 유용합니다. 다음은 여러 개의 박스 플롯을 생성하는 방법의 예입니다:
import matplotlib.pyplot as plt
import numpy as np
# 여러 그룹에 대한 샘플 데이터 생성
data = [np.random.normal(0, std, 100) for std in range(1, 5)]
# 여러 개의 박스 플롯 만들기
plt.figure(figsize=(12, 6))
plt.boxplot(data)
plt.title('Matplotlib로 여러 개의 박스 플롯 - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
plt.xticks([1, 2, 3, 4], ['A', 'B', 'C', 'D'])
plt.show()
출력:
이 예제는 네 개의 박스 플롯을 나란히 생성하여 서로 다른 그룹 간의 분포를 쉽게 비교할 수 있도록 합니다.
Matplotlib 박스플롯에 노치 추가하기
상자 그림의 노치는 서로 다른 그룹 간의 중앙값을 비교하는 시각적 단서를 제공할 수 있습니다. Matplotlib boxplot은 플롯에 노치를 추가하는 것을 지원합니다. 노치가 있는 상자 그림을 만드는 방법은 다음과 같습니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
# 노치가 있는 박스 플롯 만들기
plt.figure(figsize=(10, 6))
plt.boxplot(data, notch=True)
plt.title('Matplotlib Boxplot with Notches - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
plt.xticks([1, 2, 3], ['A', 'B', 'C'])
plt.show()
출력:
이 예제에서는 matplotlib boxplot 함수에서 notch=True
를 설정하여 박스에 노치를 추가합니다. 이 노치는 중앙값 주위의 신뢰 구간을 나타냅니다.
Matplotlib 박스플롯에서 이상치 처리
이상치는 데이터 분포의 중요한 측면이며, matplotlib boxplot은 이상치를 처리하고 표시하는 옵션을 제공합니다. 다음은 이상치를 처리하는 다양한 방법을 보여주는 예입니다:
import matplotlib.pyplot as plt
import numpy as np # 이상치가 있는 샘플 데이터 생성
np.random.seed(42)
data = np.random.normal(100, 20, 200)
outliers = np.random.uniform(50, 150, 10)
data = np.concatenate([data, outliers]) # 다양한 이상치 스타일로 박스 플롯 생성
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
# 기본 이상치 스타일
ax1.boxplot(data)
ax1.set_title('기본 이상치 - how2matplotlib.com')
# 사용자 정의 이상치 스타일
ax2.boxplot(data, flierprops={'marker': 'o', 'markerfacecolor': 'red', 'markersize': 8})
ax2.set_title('사용자 정의 이상치 - how2matplotlib.com')
plt.tight_layout()
plt.show()
출력:
이 예제는 두 개의 박스 플롯을 보여줍니다: 하나는 기본 이상치 스타일을 사용하고 다른 하나는 사용자 정의 이상치 마커를 사용합니다. matplotlib boxplot에서 flierprops
매개변수를 사용하여 이상치의 모양을 조정할 수 있습니다.
Matplotlib로 수평 박스 플롯 만들기
수직 상자 그림이 일반적이지만, matplotlib boxplot은 수평 상자 그림을 만드는 것도 지원합니다. 이는 긴 범주 이름을 다룰 때나 x축을 따라 분포를 강조하고 싶을 때 유용할 수 있습니다. 수평 상자 그림을 만드는 방법은 다음과 같습니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
data = [np.random.normal(0, std, 100) for std in range(1, 5)]
# 수평 박스 플롯 생성
plt.figure(figsize=(10, 6))
plt.boxplot(data, vert=False)
plt.title('수평 Matplotlib 박스플롯 - how2matplotlib.com')
plt.xlabel('값')
plt.ylabel('그룹')
plt.yticks([1, 2, 3, 4], ['A', 'B', 'C', 'D'])
plt.show()
출력:
이 예제에서는 matplotlib boxplot 함수에서 vert=False
로 설정하여 수평 박스 플롯을 생성합니다. 방향 변경을 반영하기 위해 x 및 y 레이블도 교환했음을 주의하세요.
Matplotlib 박스플롯에 지터링된 포인트 추가하기
기본 데이터 분포에 대한 더 많은 통찰력을 제공하기 위해, matplotlib 박스플롯에 지터링된 점을 추가할 수 있습니다. 이 기술은 특히 작은 데이터셋에 유용합니다. 다음은 박스 플롯에 지터링된 점을 추가하는 방법의 예입니다:
import matplotlib.pyplot as plt
import numpy as np # 샘플 데이터 생성
np.random.seed(42)
data = [np.random.normal(0, std, 30) for std in range(1, 4)] # 점이 흩어진 박스 플롯 생성
fig, ax = plt.subplots(figsize=(10, 6))
bp = ax.boxplot(data)
colors = ['파랑', '초록', '빨강']
for i, d in enumerate(data):
y = d
x = np.random.normal(i+1, 0.04, len(y))
ax.scatter(x, y, c=colors[i], alpha=0.4
plt.title('Matplotlib 박스플롯과 점의 흔들림 - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
ax.set_xticklabels(['A', 'B', 'C'])
plt.show()
출력:
이 예제는 플롯의 각 상자에 지터링된 점을 추가하여 각 그룹 내 데이터 분포에 대한 보다 자세한 뷰를 제공합니다.
Matplotlib로 바이올린 플롯 만들기
엄밀히 말하자면 박스 플롯은 아니지만, 바이올린 플롯은 밀접하게 관련되어 있으며 matplotlib을 사용하여 생성할 수 있습니다. 바이올린 플롯은 박스 플롯과 커널 밀도 추정의 측면을 결합합니다. 다음은 matplotlib을 사용하여 바이올린 플롯을 만드는 방법입니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
np.random.seed(10)
data = [np.random.normal(0, std, 100) for std in range(1, 5)]
# 바이올린 플롯 생성
plt.figure(figsize=(10, 6))
plt.violinplot(data)
plt.title('Matplotlib을 사용한 바이올린 플롯 - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
plt.xticks([1, 2, 3, 4], ['A', 'B', 'C', 'D'])
plt.show()
출력:
이 예제는 바이올린 플롯을 생성하며, 이는 표준 박스 플롯에 비해 데이터 분포에 대한 더 자세한 뷰를 제공합니다.
상자 그림과 바이올린 그림 결합
데이터에 대한 포괄적인 보기를 위해, matplotlib을 사용하여 박스 플롯과 바이올린 플롯을 결합할 수 있습니다. 이 접근 방식은 박스 플롯이 제공하는 요약 통계와 바이올린 플롯이 보여주는 전체 분포를 모두 볼 수 있게 해줍니다. 다음은 예시입니다:
import matplotlib.pyplot as plt
import numpy as np # 샘플 데이터 생성
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)] # 박스 플롯과 바이올린 플롯이 있는 그림 생성
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))
# 박스 플롯
ax1.boxplot(data)
ax1.set_title('박스 플롯 - how2matplotlib.com')
ax1.set_xlabel('그룹')
ax1.set_ylabel('값')
# 바이올린 플롯
ax2.violinplot(data)
ax2.set_title('바이올린 플롯 - how2matplotlib.com')
ax2.set_xlabel('그룹')
ax2.set_ylabel('값')
# 일관된 x축 레이블 설정
for ax in [ax1, ax2]:
ax.set_xticks([1, 2, 3])
ax.set_xticklabels(['A', 'B', 'C'])
plt.tight_layout()
plt.show()
출력:
이 예제는 나란히 배치된 박스 및 바이올린 플롯을 생성하여 두 시각화 기법 간의 쉬운 비교를 가능하게 합니다.
Matplotlib으로 그룹화된 박스 플롯 만들기
여러 카테고리와 그룹을 다룰 때, 그룹화된 박스 플롯을 만드는 것은 매우 유익할 수 있습니다. Matplotlib의 boxplot은 이 기능을 지원합니다. 다음은 그룹화된 박스 플롯을 만드는 방법의 예입니다:
import matplotlib.pyplot as plt
import numpy as np # 샘플 데이터 생성
np.random.seed(42)
data = { 'Group 1': [np.random.normal(0, std, 100) for std in range(1, 4)], 'Group 2': [np.random.normal(0, std, 100) for std in range(2, 5)]
} # 그룹화된 박스 플롯 생성
fig, ax = plt.subplots(figsize=(12, 6))
positions = [[1, 2, 3], [4, 5, 6]]
colors = ['연한 파란색', '연한 초록색']
for i, (group, group_data) in enumerate(data.items()):
bp = ax.boxplot(group_data, positions=positions[i], patch_artist=True)
for patch in bp['boxes']:
patch.set_facecolor(colors[i])
plt.title('그룹화된 박스 플롯 - how2matplotlib.com')
plt.xlabel('하위 그룹')
plt.ylabel('값')
ax.set_xticks([2, 5])
ax.set_xticklabels(['그룹 1', '그룹 2'])
plt.show()
출력:
이 예제는 각각 세 개의 하위 그룹을 포함하는 두 개의 박스 플롯 그룹을 생성합니다. 그룹은 색상과 위치로 구분됩니다.
Matplotlib 박스플롯에 통계 주석 추가하기
상자 그림에 더 많은 통계적 맥락을 제공하기 위해, 주요 통계를 보여주는 주석을 추가할 수 있습니다. 다음은 matplotlib 상자 그림에 평균 값과 샘플 크기를 추가하는 방법의 예입니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
# 주석이 있는 박스 플롯 생성
fig, ax = plt.subplots(figsize=(10, 6))
bp = ax.boxplot(data)
ax.set_xticklabels(['A', 'B', 'C'])
# 평균 값 추가
means = [np.mean(d) for d in data]
pos = range(len(data))
for i in range(len(data)):
ax.text(pos[i]+1, means[i], f'평균: {means[i]:.2f}',
horizontalalignment='center', verticalalignment='bottom')
# 샘플 크기 추가
for i, d in enumerate(data):
ax.text(i+1, ax.get_ylim()[0], f'n={len(d)}',
horizontalalignment='center', verticalalignment='top')
plt.title('Matplotlib 박스플롯과 통계 주석 - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
plt.show()
출력:
이 예제는 matplotlib boxplot에서 각 박스 위에 평균 값에 대한 주석을 추가하고 각 박스 아래에 샘플 크기를 추가합니다.
상자 그림 만들기와 서브플롯
여러 데이터 세트나 범주를 다룰 때, 별도의 박스 플롯을 서브플롯으로 만드는 것이 유용할 수 있습니다. Matplotlib 박스 플롯은 서브플롯 레이아웃에 쉽게 통합될 수 있습니다. 다음은 예시입니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
np.random.seed(42)
data1 = [np.random.normal(0, std, 100) for std in range(1, 4)]
data2 = [np.random.normal(0, std, 100) for std in range(2, 5)]
# 박스 플롯을 서브플롯으로 생성
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
ax1.boxplot(data1)
ax1.set_title('데이터셋 1 - how2matplotlib.com')
ax1.set_xlabel('그룹')
ax1.set_ylabel('값')
ax1.set_xticklabels(['A', 'B', 'C'])
ax2.boxplot(data2)
ax2.set_title('데이터셋 2 - how2matplotlib.com')
ax2.set_xlabel('그룹')
ax2.set_ylabel('값')
ax2.set_xticklabels(['X', 'Y', 'Z'])
plt.tight_layout()
plt.show()
출력:
이 예제는 두 개의 개별 박스 플롯을 서브플롯으로 생성하여 두 개의 서로 다른 데이터 세트 또는 카테고리 간의 쉬운 비교를 가능하게 합니다.
Matplotlib 박스플롯 수염 사용자 정의하기
상자 그림에서 수염은 일반적으로 사분위 범위의 1.5배까지 확장되지만, matplotlib boxplot은 이 동작을 사용자 정의할 수 있습니다. 다음은 다양한 수염 스타일을 보여주는 예입니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
# 다양한 수염 스타일로 박스 플롯 만들기
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
ax1.boxplot(data, whis=1.5)
ax1.set_title('기본 수염 (1.5 IQR) - how2matplotlib.com')
ax1.set_xlabel('그룹')
ax1.set_ylabel('값')
ax2.boxplot(data, whis=[5, 95])
ax2.set_title('사용자 정의 수염 (5번째-95번째 백분위수) - how2matplotlib.com')
ax2.set_xlabel('그룹')
ax2.set_ylabel('값')
plt.tight_layout()
plt.show()
출력:
이 예시는 두 가지 다른 수염 스타일을 보여줍니다: 기본 1.5배 IQR과 5번째에서 95번째 백분위수 범위를 보여주는 사용자 정의 스타일.
Matplotlib 박스플롯에 범례 추가하기
여러 개의 박스 플롯을 만들거나 다른 색상을 사용할 때, 범례를 추가하면 각 요소의 의미를 명확히 하는 데 도움이 될 수 있습니다. 다음은 matplotlib 박스 플롯에 범례를 추가하는 방법입니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
# 범례가 있는 박스 플롯 생성
fig, ax = plt.subplots(figsize=(10, 6))
bp = ax.boxplot(data, patch_artist=True)
colors = ['연한 파랑', '연한 초록', '연한 분홍']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
plt.title('Matplotlib 상자 그림과 범례 - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
# 범례 생성
legend_elements = [plt.Rectangle((0,0),1,1, facecolor=c, edgecolor='black') for c in colors]
plt.legend(legend_elements, ['그룹 A', '그룹 B', '그룹 C'], loc='upper right')
plt.show()
출력:
이 예제는 서로 다른 색상의 박스가 있는 박스 플롯을 생성하고 각 색상이 무엇을 나타내는지 설명하는 범례를 추가합니다.
Pandas DataFrame에서 박스 플롯 만들기
Matplotlib boxplot은 pandas DataFrame과 잘 통합되어 구조화된 데이터로부터 박스 플롯을 쉽게 생성할 수 있습니다. 다음은 pandas DataFrame에서 박스 플롯을 생성하는 방법의 예입니다:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 샘플 DataFrame 생성
np.random.seed(42)
df = pd.DataFrame({
'Group A': np.random.normal(0, 1, 100),
'Group B': np.random.normal(1, 1.5, 100),
'Group C': np.random.normal(2, 2, 100)
})
# 데이터프레임에서 박스 플롯 생성
plt.figure(figsize=(10, 6))
df.boxplot(column=['Group A', 'Group B', 'Group C'])
plt.title('Pandas DataFrame에서의 박스 플롯 - how2matplotlib.com')
plt.ylabel('값')
plt.show()
출력:
이 예제는 matplotlib boxplot 기능을 사용하여 pandas DataFrame에서 직접 상자 그림을 만드는 방법을 보여줍니다.
상자 그림 채우기 색상 및 투명도 사용자 정의
Matplotlib 박스플롯은 채우기 색상 및 투명도를 포함하여 시각적 요소의 광범위한 사용자 지정을 허용합니다. 다음은 이러한 측면을 사용자 지정하는 방법을 보여주는 예입니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
# 맞춤형 박스 플롯 만들기
fig, ax = plt.subplots(figsize=(10, 6))
bp = ax.boxplot(data, patch_artist=True)
colors = ['연한 파랑', '연한 초록', '연한 분홍']
alphas = [1.0, 0.7, 0.4]
for patch, color, alpha in zip(bp['boxes'], colors, alphas):
patch.set_facecolor(color)
patch.set_alpha(alpha)
plt.title('사용자 정의 채우기 색상 및 투명도 - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
ax.set_xticklabels(['A', 'B', 'C'])
plt.show()
출력:
이 예제는 matplotlib boxplot에서 각 상자에 대해 서로 다른 채우기 색상과 투명도 수준을 설정하는 방법을 보여줍니다.
비교 상자 그림 만들기
Matplotlib 박스플롯은 비교 시각화를 생성하는 데 사용될 수 있으며, 이를 통해 서로 다른 범주나 시간대에 걸쳐 분포를 쉽게 비교할 수 있습니다. 다음은 비교 박스 플롯을 만드는 방법의 예입니다:
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
np.random.seed(42)
before = [np.random.normal(0, std, 100) for std in range(1, 4)]
after = [np.random.normal(0.5, std, 100) for std in range(1, 4)]
# 비교 상자 그림 만들기
fig, ax = plt.subplots(figsize=(12, 6))
bp1 = ax.boxplot(전, positions=np.array(range(len(전)))*2.0-0.4, widths=0.6)
bp2 = ax.boxplot(후, positions=np.array(range(len(후)))*2.0+0.4, widths=0.6)
# 색상 사용자 정의
for bp in [bp1, bp2]:
for box in bp['boxes']:
box.set(color='blue' if bp == bp1 else 'red', linewidth=2)
for whisker in bp['whiskers']:
whisker.set(color='blue' if bp == bp1 else 'red', linewidth=2)
for cap in bp['caps']:
cap.set(color='blue' if bp == bp1 else 'red', linewidth=2)
for median in bp['medians']:
median.set(color='blue' if bp == bp1 else 'red', linewidth=2)
plt.title('비교 상자 그림 - how2matplotlib.com')
plt.xlabel('그룹')
plt.ylabel('값')
ax.set_xticks(range(0, len(before) * 2, 2))
ax.set_xticklabels(['A', 'B', 'C'])
ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['이전', '이후'], loc='upper left')
plt.show()
출력:
이 예제는 세 가지 다른 그룹에서 '이전'과 '이후' 시나리오를 비교하기 위해 나란히 상자 그림을 생성합니다.
Matplotlib 박스플롯 결론
Matplotlib 박스 플롯은 데이터 분포를 시각화하는 데 유용하고 강력한 도구입니다. 기본 박스 플롯부터 고급 사용자 정의 및 비교 시각화에 이르기까지, matplotlib은 정보 제공 및 시각적으로 매력적인 박스 플롯을 만들기 위한 다양한 옵션을 제공합니다. 이러한 기술을 마스터함으로써 데이터 분석 및 연구 프로젝트에서 복잡한 데이터 패턴과 분포를 효과적으로 전달할 수 있습니다.
matplotlib boxplot으로 효과적인 시각화를 만드는 핵심은 데이터를 이해하고 분포의 중요한 측면을 가장 잘 강조하는 적절한 사용자 지정을 선택하는 것입니다. 다양한 스타일, 색상 및 주석을 실험하여 데이터를 가장 효과적으로 표현하는 방법을 찾아보세요.