본문 바로가기
파이썬/시각화 matplot

데이터의 범위와 분포를 표현하는 바이올린플롯 violinplot(data)

by Merware 2023. 5. 16.

[학습목표]
바이올린플롯으로 데이터의 범위와 분포를 표현할 수 있다.

import matplotlib.pyplot as plt
import pandas as pd
# 그래프에 한글 설정
plt.rcParams['font.family'] = 'NanumGothic'

# 그래프에 마이너스 기호 깨지는 문제 해결
plt.rcParams['axes.unicode_minus'] = False

 

바이올린플롯

샘플 데이터

  • 125명의 점수 데이터
scores = pd.Series([0,10,15,15,15,16,19,20,21,25,25,26,26,29,30,35,36,37,39,40,41,41,44,45,45,45,45,47,
          50,50,50,50,51,51,51,53,54,55,55,56,60,61,62,62,63,64,65,65,65,65,66,66,66,66,66,
          67,68,68,69,70,70,70,70,70,70,70,70,71,71,71,71,71,72,72,72,72,73,74,74,74,75,75,
          76,76,76,77,77,77,77,78,78,78,78,78,79,79,79,79,80,80,80,80,80,80,81,81,81,82,82,
          85,85,85,88,88,89,90,90,90,93,93,95,95,95,97,100])
          
len(scores)
125

 

바이올린플롯

  • plt.violinplot(data)
plt.violinplot(scores)

 

 

최대값, 최소값, 평균값, 중간값 표시

  • showextrema=True/False : 최대값,최소값에 직선 표시(default:True)
  • showmeans=True/False : 평균값에 직선 표시(default:False)
  • showmedians=True/False : 중간값에 직선 표시(default:False)

 

분위수 지정하기

  • quantiles=0~1사이의 실수리스트
plt.violinplot(scores, showextrema=True, showmeans=True, showmedians=True
              ,quantiles=[0.25, 0.75])
plt.show()

 

스타일 지정하기

  • 바이올린플롯 객체를 받아서 스타일을 지정한다.
  • 플롯['bodies'][인덱스].set_facecolor(컬러)
  • 플롯['cmins'].set_edgecolor(컬러)
  • 플롯['cmaxes'].set_edgecolor(컬러)
  • 플롯['cbars'].set_edgecolor(컬러)
  • 플롯['cmedians'].set_edgecolor(컬러)
  • 플롯['cquantiles'].set_edgecolor(컬러)
  • 플롯['cmeans'].set_edgecolor(컬러)
v1 = plt.violinplot(scores, showextrema=True, showmeans=True, showmedians=True
              ,quantiles=[0.25, 0.75])
v1['bodies'][0].set_facecolor('r')
v1['cmins'].set_edgecolor('g')
v1['cmaxes'].set_edgecolor('g')
v1['cbars'].set_edgecolor('k')
v1['cmedians'].set_edgecolor('r')
v1['cquantiles'].set_edgecolor('w')
v1['cmeans'].set_edgecolor('y')
plt.show()

 

여러 개의 데이터 비교하기

샘플 데이터

  • 붓꽃 데이터
import seaborn as sns
iris = sns.load_dataset('iris')
iris.head()

"""
sepal_length	sepal_width	petal_length	petal_width	species
0	5.1	3.5	1.4	0.2	setosa
1	4.9	3.0	1.4	0.2	setosa
2	4.7	3.2	1.3	0.2	setosa
3	4.6	3.1	1.5	0.2	setosa
4	5.0	3.6	1.4	0.2	setosa

 

바이올린 플롯

기본 그리기

  • plt.violinplot(데이터리스트)
plt.violinplot([iris['sepal_length'], iris['sepal_width'], iris['petal_length'], iris['petal_width']])
plt.show()

 

x틱

plt.violinplot([iris['sepal_length'], iris['sepal_width'], iris['petal_length'], iris['petal_width']])
plt.xticks(range(1,5,1), labels=['sepal_length','sepal_width','petal_length','petal_width'])
plt.show()

 

평균값, 중간값 표시

plt.violinplot([iris['sepal_length'], iris['sepal_width'], iris['petal_length'], iris['petal_width']]
              , showmeans=True, showmedians=True)
plt.xticks(range(1,5,1), labels=['sepal_length','sepal_width','petal_length','petal_width'])
plt.show()

 

분위수 표시

  • quantiles=분위수리스트
    데이터별로 각각 지정한다.
plt.violinplot([iris['sepal_length'], iris['sepal_width'], iris['petal_length'], iris['petal_width']]
              , showmeans=True, showmedians=True
              , quantiles=[[0.25,0.75],[0.25,0.75],[0.25,0.75],[0.25,0.75]])
plt.xticks(range(1,5,1), labels=['sepal_length','sepal_width','petal_length','petal_width'])
plt.show()

 

스타일 지정하기

  • 바이올린플롯 객체를 받아서 스타일을 지정한다.
  • 플롯['bodies'][인덱스].set_facecolor(컬러)
  • 플롯['cmins'].set_edgecolor(컬러)
  • 플롯['cmaxes'].set_edgecolor(컬러)
  • 플롯['cbars'].set_edgecolor(컬러)
  • 플롯['cmedians'].set_edgecolor(컬러)
  • 플롯['cquantiles'].set_edgecolor(컬러)
  • 플롯['cmeans'].set_edgecolor(컬러)
v2 = plt.violinplot([iris['sepal_length'], iris['sepal_width'], iris['petal_length'], iris['petal_width']]
              , showmeans=True, showmedians=True
              , quantiles=[[0.25,0.75],[0.25,0.75],[0.25,0.75],[0.25,0.75]])

v2['bodies'][0].set_facecolor('r')
v2['bodies'][1].set_facecolor('g')
v2['bodies'][2].set_facecolor('b')
v2['bodies'][3].set_facecolor('c')
v2['cmins'].set_edgecolor('r')
v2['cmaxes'].set_edgecolor('r')
v2['cmeans'].set_edgecolor('r')

plt.xticks(range(1,5,1), labels=['sepal_length','sepal_width','petal_length','petal_width'])

plt.grid(axis='y', ls=':', alpha=0.5)
plt.show()