R | plotly | Violin Plot - 바이올린 플롯

2023. 1. 31. 15:35·R/plotly

 

 

 

저번 포스팅에서는 기술 통계에서 중요한 그래프인 박스 플롯을 plotly 패키지를 사용해서 구현해 보았다.

 

이번 포스팅에서는 박스플롯과 유사하지만  커널 밀도 곡선(Kernel Density Curvce)과 박스 플롯을 합친 형태인 바이올린 플롯(Violin Plot)을 시각화 할 것이다.

 

박스플롯의 경우 데이터의 25%, 50%, 75%의 사분위 지점을 알 수 있지만 데이터의 전반적인 분포를 파악하기는 어렵다. 

이 단점을 극복하기 위해 사용하는 시각화가 바이올린 플롯이며 바이올린 플롯은 카테고리값에 따른 각 분포의 실제 데이터 또는 전체 형상을 보여준다.

 

 

plotly 패키지에서는  add_trace(type = 'violin') 만을 제공한다. 

plotly_violin-plot.html
4.66MB

그래프 조작은 html 파일 다운로드 하세요~!


 

 

00. 패키지 로드 및 데이터 불러오기 

- 크론병 데이터 

library(dplyr)
library(plotly)

library(showtext)
### 한글 폰트 설정 
font_add_google("Nanum Gothic", "nanumgothic")
## 데이터 불러오기 : 크론병 데이터 
df <- read.csv("https://vincentarelbundock.github.io/Rdatasets/csv/robustbase/CrohnD.csv")
data.1 <- df[-1]
data.1 %>% head()

 


 

 

01. 연속형 변수 Violin plot

 

- 기본적으로 box plot을 그리기 위해서는  x or y축에 연속형 변수를 매핑하고, type = 'violin'로 지정해야 한다. 

plot_ly(data = , x = ~, y = ~, type = 'violin')

 

- 연속형 변수 'BMI'의 분포를 확인

## 수직 violin plot
plot_ly(df , x='', y=~BMI, type='violin',
         box = list(visible = T)) %>% # 박스플롯 추가
  
  layout(title = "1개의 연속형 변수(BMI) 탐색",
         font=list(family ='nanumgothic'),
         xaxis = list(title=""), 
         yaxis = list(title=""),
         margin = list(l=10, r=20, b=10, t=30, pad=0))

 

## 수평 violin plot
plot_ly(data.1 , x=~BMI, type='violin',
         box = list(visible = T))%>%
  
  layout(title = "1개의 연속형 변수(BMI) 탐색",
         font=list(family ='nanumgothic'),
         xaxis = list(title=""), 
         yaxis = list(title=""),
         margin = list(l=10, r=20, b=10, t=30, pad=0))

 


 

02. 연속형&범주형 변수 Violin plot

 

1)  연속형 변수 1개 범주형 변수 1개 시각화 하기

 

- 연속형 변수와 범주형 변수 총 2개의 변수를 사용해 violin plot을 그리기 위해서는 

   x, y축에 변수를 매핑하고, type = 'violin'로 지정한 후 split 속성에 범주형 변수를 매핑해야 한다. 

plot_ly(data = , x = ~범주형변수, y = ~연속형변수, type = 'violin',
        split = ~ 범주형변수)

 

 

- treat에 따른 환자의 BMI 분포를 보기 위해서 x축에 treat(범주형) 변수를 y축에 BMI(연속형) 변수를 매핑한 후,

  split에 treat 변수를 매핑하여 총 3개의 바이올린 플롯으로 나눴다. 

plot_ly(data.1,x=~treat,y=~BMI, 
              type='violin',box = list(visible = T),
              split=~treat) %>% 
  
    layout(title = "treat에 따른 BMI 분포",
         font=list(family ='nanumgothic'),
         xaxis = list(title=""), 
         yaxis = list(title=""),
         margin = list(l=10, r=20, b=10, t=30, pad=0))

 

 

2)  연속형 변수 1개 범주형 변수 2개 시각화 하기

 

- 연속형 변수와 범주형 변수 2개 총 3개의 변수를 사용해 violin plot을 그리기 위해서는 

   x, y축에 변수를 매핑하고, type = 'violin'로 지정한 후 split 속성에 범주형 변수a & color 속성에 범주형 변수b를 매핑해야 한다. 

- 또한 layout(violinmode = 'group')으로 지정해줘야 한다. 

plot_ly(data = , x = ~범주형변수a, y = ~연속형변수, type = 'violin',
        split = ~ 범주형변수a,
        color = ~ 범주형변수b) %>%
    layout(violinmode ='group')

 

plot_ly(data.1,x=~treat,y=~BMI, 
              type='violin',box = list(visible = T),
              split=~treat,
              color = ~sex) %>% 
  
    layout(
         violinmode ='group',
         title = "treat과 sex에 따른 BMI 분포",
         font=list(family ='nanumgothic'),
         xaxis = list(title=""), 
         yaxis = list(title=""),
         margin = list(l=10, r=20, b=10, t=30, pad=0))

 

 

 

- violinmode = 'group'으로 지정하여 두 범주형 변수를 지정할 수도 있지만

  plotly 패키지에서는 바이올린 플롯을 반으로 나누어서  두 개의 그룹을 비교해 볼 수 있는 형태의 바이올린 플롯도 제공한다. 

 

- layout 속성에 violinmode = 'overlay'로 설정하고 비교할 violin trace 두 개에 side 속성을  ’positive’와 ’negative’로 오른쪽과 왼쪽의 위치를 설정하면 된다. 

plot_ly() %>% 
  add_trace( data = data.1 %>% filter(sex =='F'),  # 성별이 여자인 그룹의 treat별 BMI 분포
              x=~treat,y=~BMI, 
              type='violin',box = list(visible = T),
              side = 'positive', name = "Female") %>% 
              
  add_trace( data = data.1 %>% filter(sex =='M'),  # 성별이 남자인 그룹의 treat별 BMI 분포
              x=~treat,y=~BMI, 
              type='violin',box = list(visible = T),
              side = 'negative', name = "Male") %>% 
    layout(
         violinmode ='overlay',
         title = "treat과 sex에 따른 BMI 분포",
         font=list(family ='nanumgothic'),
         xaxis = list(title=""), 
         yaxis = list(title=""),
         margin = list(l=10, r=20, b=10, t=30, pad=0))

 


 

03. 바이올린 플롯에 평균(meanline) 추가하기 

 

- vlion trace 속성에 meanline = list(visible = T)을 추가하면 된다. 

plot_ly(data.1,x=~treat,y=~BMI, 
              type='violin',box = list(visible = T),
              meanline = list(visible = T),
              split=~treat) %>% 
  
    layout(title = "treat에 따른 BMI 분포(mean 추가)",
         font=list(family ='nanumgothic'),
         xaxis = list(title=""), 
         yaxis = list(title=""),
         margin = list(l=10, r=20, b=10, t=30, pad=0))

 

 

 

 

 

 

 


참고 문헌(reference)

더보기

참고 사이트

https://plotly.com/r/violin/

 

Violin

Detailed examples of Violin Plots including changing color, size, log axes, and more in R.

plotly.com

https://2stndard.tistory.com/78

 

반 반 바이올린 플롯 in R

violin trace의 사용 사용데이터 : https://2stndard.tistory.com/68 박스 플롯은 데이터의 전반적 분포를 살펴볼 수 있는 매우 좋은 시각화 방법이다. 앞서 설명한 산점도는 X, Y축 모두 연속형 수치 데이터를

2stndard.tistory.com

 

 

'R > plotly' 카테고리의 다른 글

R | plotly | Line Plot - 선 그래프  (1) 2023.02.02
R | plotly | Bubble Chart - 버블 차트  (0) 2023.02.01
R | plotly | Scatter Plot - 산점도  (0) 2023.02.01
R | plotly | box plot  (0) 2023.01.31
R | plotly | Bar Chart - 막대 그래프  (0) 2023.01.30
'R/plotly' 카테고리의 다른 글
  • R | plotly | Bubble Chart - 버블 차트
  • R | plotly | Scatter Plot - 산점도
  • R | plotly | box plot
  • R | plotly | Bar Chart - 막대 그래프
갬보리
갬보리
제발 코드정리좀 하자 (R, SQL, SAS, Python , etc...)
  • 갬보리
    보딩코
    갬보리
  • 전체
    오늘
    어제
    • 분류 전체보기 (50) N
      • R (32)
        • dplyr (7)
        • preprocessing (2)
        • EDA (0)
        • ggplot2 (10)
        • plotly (11)
        • leaflet (2)
      • SQL (15)
      • SAS (0)
      • Python (1)
        • preprocessing (0)
        • Library (0)
      • ETC (2) N
        • ML (1) N
  • hELLO· Designed By정상우.v4.10.3
갬보리
R | plotly | Violin Plot - 바이올린 플롯
상단으로

티스토리툴바