함께하는 데이터 분석

[Python] Matplotlib violinplot 그리기 본문

데이터분석 공부/Python

[Python] Matplotlib violinplot 그리기

JEONGHEON 2022. 4. 12. 20:04

이번에는 matplotlib을 통하여

 

violinplot을 그려보겠습니다.

 

데이터는 boxplot에서 쓴 iris데이터를 사용하겠습니다.

 

같은 데이터로 그래프를 그리면 차이점을 명확히 느낄 수 있겠죠?

 

시작해보겠습니다.

 

 

라이브러리 불러오기

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

plt.rc('font', family = 'AppleGothic') # mac 
# plt.rc('font', family = 'Malgun Gothic') # window
plt.rc('font', size = 12)
plt.rc('axes', unicode_minus = False) # -표시 오류 잡아줌

 

 

데이터 불러오기

iris = sns.load_dataset("iris")
iris.head()

 

 

데이터 확인하기

iris.shape

>>> (150, 5)

 

iris.info()

 

iris.describe()

 

 

단일 violinplot 그리기

plt.figure(figsize = (10, 5))
plt.violinplot(iris['sepal_length'])
plt.show()

boxplot에서 violinplot으로 바꿔주면 됩니다.

 

그래프를 보시면 boxplot처럼 최대 최소를 나타내 주는 선이 존재하고

 

옵션을 활용하면 중위수나 quantile을 넣어줄 수 있습니다.

 

차이점은 분포의 모습을 보여준다는 것이죠.

 

분포의 모습도 확인하고 싶을 때 사용하시면 됩니다.

 

 

여러 개의 violinplot 그리기

idx = np.arange(1, 5)
labels = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']

plt.figure(figsize = (10, 5))
plt.violinplot([iris['sepal_length'], iris['sepal_width'],\
           iris['petal_length'], iris['petal_width']])
plt.xticks(idx, labels)
plt.show()

idx를 이용하여 각각의 violinplot이 어떤 column 데이터로 이루어졌는지

 

label을 달아줬습니다.

 

이번에도 마찬가지로 수평 violinplot을 그려볼까요?

 

 

수평 violinplot 그리기

idx = np.arange(1, 5)
labels = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']


plt.figure(figsize = (10, 5))
plt.violinplot([iris['sepal_length'], iris['sepal_width'],\
           iris['petal_length'], iris['petal_width']],\
            vert = False)
plt.yticks(idx, labels)
plt.show()

vert = False 즉, 수직이 아닌 수평으로 그린다는 의미입니다.

 

이제 boxplot처럼 median을 표시하는 선을 그어볼까요?

 

 

Median 표시하기

idx = np.arange(1, 5)
labels = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']

plt.figure(figsize = (10, 5))
plt.violinplot([iris['sepal_length'], iris['sepal_width'],\
           iris['petal_length'], iris['petal_width']],\
               showmedians = True)
plt.xticks(idx, labels)
plt.show()

plt.violinplot에 showmedians = True를 넣어주면

 

medain을 표시해줍니다.

 

평균을 그려주고 싶으면 showmeans = True를 이용하면 됩니다.

 

이번에는 50% 중위수가 아닌 다양한 quantiles를 표시해주겠습니다.

 

 

Quantiles 설정하기

idx = np.arange(1, 5)
labels = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
quantiles = [[0.75, 0.25], [0.1, 0.9], [0.2, 0.8], [0.4, 0.6]]

plt.figure(figsize = (10, 5))
plt.violinplot([iris['sepal_length'], iris['sepal_width'],\
           iris['petal_length'], iris['petal_width']],\
               quantiles = quantiles)
plt.xticks(idx, labels)
plt.show()

quantiles라는 보고 싶은 분위수를 리스트로 만들고

 

quatiles인자에 넣어주면 됩니다.

 

만약 boxplot처럼 보고 싶다면 [0.25, 0.75]로 설정해주시면 됩니다.

 

 

색상 지정하기

idx = np.arange(1, 5)
labels = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']

plt.figure(figsize = (10, 5))
vi = plt.violinplot([iris['sepal_length'], iris['sepal_width'],\
           iris['petal_length'], iris['petal_width']],\
               showmedians = True)
plt.xticks(idx, labels)
vi['bodies'][0].set_facecolor('aqua')
vi['bodies'][1].set_facecolor('red')
vi['bodies'][2].set_facecolor('lightgreen')
vi['bodies'][3].set_facecolor('pink')
plt.show()

plt.violinplt을 vi에 할당시켜주고

 

vi['bodies']에 인덱스를 설정한 다음

 

set_facecolor을 통해 색깔을 지정해주면 됩니다.

 

하지만 그래프의 개수가 늘어나면 한줄한줄 코드를 작성하기 번거롭습니다.

 

for문을 통하여 쉽게 작성해 볼까요?

 

 

for문을 통하여 색상 지정하기

idx = np.arange(1, 5)
labels = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
colors = ['aqua', 'red', 'lightgreen', 'pink'] 

plt.figure(figsize = (10, 5))
vi = plt.violinplot([iris['sepal_length'], iris['sepal_width'],\
           iris['petal_length'], iris['petal_width']],\
               showmedians = True)
plt.xticks(idx, labels)
for i in range(0, 4) :
    vi['bodies'][i].set_facecolor(colors[i])
plt.show()

colors에 원하는 색상을 리스트로 할당시켜주고

 

vi['bodies']와 colors에 인덱싱을 통하여

 

한 번에 설정해줬습니다.

 

마지막으로 title, xlabel, ylabel을 달아주겠습니다.

 

 

종합

idx = np.arange(1, 5)
labels = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
colors = ['aqua', 'red', 'lightgreen', 'pink'] 

plt.figure(figsize = (10, 5))
plt.title("iris 데이터의 violinplot")
plt.xlabel('꽃받침, 꽃잎의 길의 너비')
plt.ylabel('단위 : cm')
vi = plt.violinplot([iris['sepal_length'], iris['sepal_width'],\
           iris['petal_length'], iris['petal_width']],\
               showmedians = True)
plt.xticks(idx, labels, rotation = 30)
for i in range(0, 4) :
    vi['bodies'][i].set_facecolor(colors[i])
plt.show()

다음에는 subplot을 이용하여

 

여러 개의 그래프를 한 화면에 그려보도록 하겠습니다!