저번 포스팅에서는 기술 통계에서 중요한 그래프인 박스 플롯을 plotly 패키지를 사용해서 구현해 보았다.
이번 포스팅에서는 박스플롯과 유사하지만 커널 밀도 곡선(Kernel Density Curvce)과 박스 플롯을 합친 형태인 바이올린 플롯(Violin Plot)을 시각화 할 것이다.
박스플롯의 경우 데이터의 25%, 50%, 75%의 사분위 지점을 알 수 있지만 데이터의 전반적인 분포를 파악하기는 어렵다.
이 단점을 극복하기 위해 사용하는 시각화가 바이올린 플롯이며 바이올린 플롯은 카테고리값에 따른 각 분포의 실제 데이터 또는 전체 형상을 보여준다.
plotly 패키지에서는 add_trace(type = 'violin') 만을 제공한다.
그래프 조작은 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)
참고 사이트
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 |