11.4 바이올린 그래프
이번 절에서는 한 개의 연속형인 변수에 대한 시각화 방법으로 바이올린 그래프(Violin Plot)를 작성해 보겠습니다.
바이올린 그래프는 geom_violin()
함수를 이용하여 그릴 수 있습니다.
제공해 주는 정보량이 많아서 바이올린 그래프(Violin Plot) 또한 유용한 편인데요, 실전에서는 별로 사용하지 않게 되는 그래프이기도 합니다. ^^;
11.4.1 데이터 세트
데이터는 MASS
패키지에 들어있는 Cars93
데이터 프레임 데이터 셋에서 가격(Price
)과 자동차 유형(Type
) 변수를 활용하여 바이올린 그래프를 그려보겠습니다.
library(ggplot2)
# Cars93 데이터 프레임
library(MASS)
str(Cars93)
11.4.2 기본 바이올린 그래프
그럼, 먼저 Cars93
데이터 프레임 내 가격(Price
) 변수 하나를 가지고 geom_violin()
을 사용하여 바이올린 그래프(Violin Plot)을 그려보겠습니다.
# 기본 바이올린 그래프 그리기
ggplot(Cars93,
aes(x = 1, # 바이올린 그래프는 기본적으로 x = 1로 설정합니다.
y = Price)) + # Y축의 변수로 Price를 설정합니다.
geom_violin() + # 바이올린 그래프를 그립니다.
ggtitle("기본 바이올린 그래프")
11.4.3 바이올린 그래프와 박스 그래프 겹쳐 그리기
그런데 바이올린 그래프에 geom_boxplot()
함수를 추가하여 박스 그래프를 겹쳐 그릴 수 있습니다.
# 기본 바이올린 그래프 + 박스 그래프
ggplot(Cars93,
aes(x = 1,
y = Price)) +
geom_violin() +
geom_boxplot(width = 0.1) + # 박스 그래프의 너비를 0.1로 해서 겹쳐 그립니다.
ggtitle("기본 바이올린 그래프 + 박스 그래프")
11.4.4 X축의 이름과 척도 없애기
기본 바이올린 그래프를 그려 보면 X 축에 의미가 없는 척도가 표시가 됩니다. scale_x_continuous()
함수의 모수에 breaks = NULL
을 설정하여 X축의 이름을 없애고, theme()
함수의 모수에 axis.title.x = element_blank()
를 설정하여 X축의 척도를 생략할 수 있습니다.
# X축의 이름과 척도 없애기
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin() +
# geom_boxplot(width = 0.1) +
scale_x_continuous(breaks = NULL) + # x축 이름 생략
theme(axis.title.x = element_blank()) + # x축 척도 생략
ggtitle("X축의 이름과 척도 없애기")
11.4.5 이상값의 표현
앞에서의 바이올린 그래프의 윗 부분에 가격(Price
) 데이터의 이상치(outliers)
가 차지하고 있습니다. 그런데 이상치는 바이올린 그래프에서 표시하는 것보다는 박스 그래프에서 표시하는 것이 더 좋습니다.
따라서, geom_boxplot() 함수를 이용하여 이상치를 표시하고, 크기는 outlier.size
모수에, 모양은 outlier.shape
모수에, 그리고 색은 outlier.colour
등의 모수에 지정해 줍니다.
다음의 예는 이상치 데이터에 대하여 모양을 13
번 모양9으로 하고, 그 크기는 3
(기본 값은 1)으로 그리고 색은 “red”
로 표시하는 예입니다.
# 바이올린 플롯의 이상치 표시
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin(outlier.size = 3, # 이상치 데이터 기호의 크기를 3으로 설정합니다.
outlier.shape = 13, # 이상치 데이터 기호의 모양을 13으로 설정합니다.
outlier.colour = "red") + # 이상치 데이터 기호의 색을 "red"로 설정합니다.
# geom_boxplot(width = 0.1) +
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
ggtitle("바이올린 플롯의 이상치 표시")
## Warning: Ignoring unknown parameters: outlier.size, outlier.shape,
## outlier.colour
# 바이올린 플롯의 이상치 표시
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin() +
geom_boxplot(width = 0.1,
outlier.size = 3, # 이상치 데이터 기호의 크기를 3으로 설정합니다.
outlier.shape = 13, # 이상치 데이터 기호의 모양을 13으로 설정합니다.
outlier.colour = "red") + # 이상치 데이터 기호의 색을 "red"로 설정합니다.
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
ggtitle("바이올린 플롯의 이상치 표시")
11.4.6 바이올린 그래프에 데이터를 점으로 표시하기
바이올린 그래프에 데이터를 점으로 표시하는 것은 박스 그래프에서와 마찬가지로 geom_jitter()
함수를 이용헙니다.
또한 geom_jitter()
함수 안의 shape
모수를 이용하여 점의 모양10을 그리고 position
모수를 이용하여 점의 위치를 설정할 수 있습니다.
# 바이올린 그래프에 데이터를 점으로 표시하기
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin() +
geom_boxplot(width = 0.1,
outlier.size = 3,
outlier.shape = 13,
outlier.colour = "red") +
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
geom_jitter() + # 데이터를 점으로 표시합니다.
ggtitle(" 바이올린 그래프에 데이터를 점으로 표시하기")
# 바이올린 그래프에 데이터를 점으로 표시하기
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin() +
geom_boxplot(width = 0.1,
outlier.size = 3,
outlier.shape = 13,
outlier.colour = "red") +
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
geom_jitter(shape = 16, # 데이터 기호의 모양을 16으로 설정합니다.
position = position_jitter(width = 0.1,
height = 0.1)) + # 점의 위치를 설정합니다.
ggtitle(" 바이올린 그래프에 데이터를 점으로 표시하기")
## Scale for 'x' is already present. Adding another scale for 'x', which will
## replace the existing scale.
11.4.7 수평 바이올린 그래프
coord_flip()
함수를 추가하여 바이올린 그래프를 수평으로 회전시킬 수 있습니다.
# 수평 바이올린 그래프
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin() +
geom_boxplot(width = 0.1,
outlier.size = 3,
outlier.shape = 13,
outlier.colour = "red") +
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
geom_jitter(shape = 16,
position = position_jitter(width = 0.1,
height = 0.1)) +
ggtitle("수평 바이올린 그래프") +
coord_flip() # 바이올린 그래프를 수평으로 회전시킵니다.
11.4.8 바이올린 그래프의 색 지정하기
또한 geom_violin()
함수에 fill
모수를 추가하여 채우기 색을 그리고 colour
모수를 추가하여 바이올린 그래프의 테두리 색을 설정할 수 있습니다.
# 바이올린 그래프의 색 지정하기
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin(fill = "yellow", # 채우기 색을 지정합니다.
color = "blue") + # 테두리 색을 지정합니다.
geom_jitter(shape = 16,
position = position_jitter(width = 0.1, height = 0.1)) +
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
ggtitle("바이올린 그래프의 색 지정하기")
11.4.9 바이올린 그래프에 평균 추가하기
위의 차종(Type
)별 바이올린 그림의 바이올린 가운데 선은 중앙값(Median)을 나타냅니다.
이번에는 평균을 추가해 보도록 하겠습니다. 평균은 이상치에 민감하므로 아래 예제처럼 이상치가 있는 경우에는 중심화 경향을 나타내는 통계량으로 부적합하며, 바이올린 그림의 바이올린 가운데에 쳐진 선이 의미하는 중앙값(Median) 이 더 적합한 중심화 경향 지표라고 하겠습니다.
평균을 추가하기 위해서는 stat_summary()
함수를 이용합니다. 그리고 fun.y = “mean”
모수를 추가해 줍니다. 다음의 예에서는 동시에 기호의 모양, 크기, 그리고 색도 지정하고 있습니다.
# 바이올린 그래프에 평균 추가하기
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin() +
stat_summary(fun.y = "mean", # Y축의 평균값을 산출합니다
geom = "point", # 점으로 표시합니다.
shape = 8, # 점의 모양을 8로 지정합니다.
size = 3, # 점의 크기를 지정합니다.
colour = "blue") + # 점의 색을 지정합니다.
ggtitle("바이올린 그래프에 평균 추가하기")
## Warning: `fun.y` is deprecated. Use `fun` instead.
11.4.10 stat_ydensity()
함수의 이용
geom_*()
함수들은 기본적인 stat_*()
함수를 가지고 있습니다.11 args(geom_violin)
로 확인해 보면 geom_violin()
함수는 stat = "ydensity"
를 알고리즘으로 사용하고 있습니다.
geom_violin()
함수의 경우에는 stat_ydensity()
함수가 여기에 해당하며, geom_violin()
함수 대신에 stat_boxplot()
함수를 이용할 수 있습니다.
# 기본 박스 그래프 그리기
ggplot(Cars93,
aes(x = 1,
y = Price)) +
stat_ydensity() + # 바이올린 그래프를 그립니다.
ggtitle("기본 바이올린 그래프 : stat_ydensity() 함수 이용")
자세한 사항은 ? stat_ydensity()
로 확인하기 바랍니다.
11.4.11 그룹별 바이올린 그래프
그룹별 바이올린 그래프의 경우도 앞에서의 그룹별 히스토그램과 그룹별 커널 밀도 곡선에서 처럼 aes()
함수의 모수를 이용하거나, facet_grid()
함수와 facet_wrap()
함수를 이용하여 그룹별 바이올린 그래프를 작성할 수 있습니다.
11.4.11.1 aes()
함수의 모수 이용
다음으로, 차종별(Type
)로 가격(Price
) 변수에 대해 바이올린 그래프를 그려보겠습니다. aes(x = factor.variable)
을 입력해주면 되겠습니다.
여기서 주의할 점은 x 는 요인(factor)형 변수가 입력되어야 합니다. 차종(Type
)은 이미 요인형 변수이므로 그대로 입력하면 됩니다. 만약 요인형 변수가 아니라면 x=factor(variable name)
이런 식으로 입력해주거나, 아니면 형 변환 함수인 as.factor()
함수를 이용하여 데이터 형태를 요인형 변수로 변경해도 좋습니다.
한편 이러한 차종별(Type
) 그룹별 바이올린 그래프의 테두리 색을 지정하고 싶다면, aes()
함수에 colour = factor.variable
을 삽입해 주면 됩니다. 그리고 바이올린의 색을 채우고 싶다면 aes()
함수에 fill = factor variable
를 추가해 주면 됩니다.
그런데 colour
와 fill
모수는 동시에 사용하기 보다는 둘 중의 하나를 선택하는 것이 좋을 것 같습니다.
## 그룹별 바이올린 그래프 : aes() 모수 이용
# 차종별(Type) 바이올린 그래프
ggplot(Cars93,
aes(x = Type, # x 축에 요인형(그룹) 변수를 지정합니다.
y = Price)) + # y 축에 일변량 연속형 변수를 지정합니다.
geom_violin(width=0.8) +
ggtitle("차종별(Type) 바이올린그래프")
# 차종별(Type) 바이올린 그래프 : 테두리 색 지정
ggplot(Cars93,
aes(x = Type,
y = Price,
colour = Type)) + # colour 에 요인형 변수 지정.
geom_violin(width=0.8) +
ggtitle("차종별(Type) 바이올린그래프 : 테두리 색 지정")
# 차종별(Type) 바이올린 그래프 : 색 채우기
ggplot(Cars93,
aes(x = Type,
y = Price,
# colour = Type, # 테두리 색을 지정합니다.
fill = Type)) + # 채우기 색을 지정합니다.
geom_violin(width=0.8) +
ggtitle("차종별(Type) 바이올린그래프 : 색 채우기")
11.4.11.2 facet_grid()
함수 이용
aes()
함수에 x = Type
모수를 추가하고, facet_grid( . ~ Type)
을 추가해 줍니다. (facet_grid(vars(Type))
또는 facet_type(Type ~ .)
등은 바람직 하지 않습니다.)
## 그룹별 바이올린 그래프 : facet_grid() 함수 이용
# 차종별(Type) 바이올린그래프
ggplot(Cars93,
aes(x = 1, y = Price)) +
geom_violin(width=0.8) +
facet_grid( . ~ Type) + # Type 별로 바이올린 그래프를 그립니다.
ggtitle("차종별(Type) 바이올린그래프 : facet_grid() 함수")
# 차종별(Type) 바이올린그래프 : 색 지정하기 (테두리 선)
ggplot(Cars93,
aes(x = 1, y = Price,
colour = Type)) +
geom_violin(width=0.8) +
facet_grid( . ~ Type) + # Type 별로 바이올린 그래프를 그립니다.
ggtitle("차종별(Type) 바이올린그래프 : facet_grid() 함수")
# 차종별(Type) 바이올린그래프 : 색 지정하기 (채우기)
ggplot(Cars93,
aes(x = 1, y = Price,
fill = Type)) +
geom_violin(width=0.8) +
facet_grid( . ~ Type) + # Type 별로 바이올린 그래프를 그립니다.
ggtitle("차종별(Type) 바이올린그래프 : facet_grid() 함수")
11.4.11.3 facet_wrap()
함수 이용
aes()
함수에 x = Type
모수를 추가하고, facet_wrap(~ Type, ncol = 3)
을 추가해 줍니다.
## 그룹별 바이올린 그래프 : facet_wrap() 함수 이용
# 차종별(Type) 바이올린그래프
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin(width=0.8) +
facet_wrap(~ Type, ncol = 3) + # Type 별로 바이올린 그래프를 3열로 그립니다.
ggtitle("차종별(Type) 바이올린그래프 : facet_wrap() 함수")
# 차종별(Type) 바이올린그래프 : 테두리 선
ggplot(Cars93, aes(x = 1, y = Price,
colour = Type)) + # 테두리 선의 색을 지정합니다.
geom_violin(width = 0.8) +
facet_wrap(~ Type, ncol = 3) + # Type 별로 바이올린 그래프를 3열로 그립니다.
ggtitle("차종별(Type) 바이올린그래프 : facet_wrap() 함수")
# 차종별(Type) 바이올린그래프 : 색 채우기
ggplot(Cars93, aes(x = 1, y = Price,
fill = Type)) + # 채우기 색을 지정합니다.
geom_violin(width=0.8) +
facet_wrap(~ Type, ncol = 3) + # Type 별로 바이올린 그래프를 3열로 그립니다.
ggtitle("차종별(Type) 바이올린그래프 : facet_wrap() 함수")
11.4.12 두 개의 요인형 변수를 고려한 바이올린 그래프
만약 차종(Type
)과 생산지(Origin
)의 두 기준/그룹으로 구분해서 바이올린 그래프를 그리고 싶다면 이 경우에도 aes()
함수의 모수를 이용하는 방법, facet_grid()
함수를 이용하는 방법 그리고 facet_wrap()
을 이용하는 방법을 생각할 수 있습니다.
11.4.12.1 aes()
함수의 모수 이용
aes(fill = Origin)
또는 aes(color = Origin)
을 추가해 주면 됩니다.
# 두 기준/그룹별 바이올린 그래프 그리기 : aes() 함수의 모수 이용
# fill 모수 지정
ggplot(Cars93,
aes(x = Type, # Type 변수를 X로 지정합니다.
y = Price,
fill = Origin)) + # Orgin 변수를 fill의 값으로 지정합니다.
geom_violin(width=0.8) +
ggtitle("차종과 생산지 별 바이올린 그래프 : fill")
# colour 모수 지정
ggplot(Cars93,
aes(x = Type, # Type 변수를 X로 지정합니다.
y = Price,
colour = Origin)) + # Orgin 변수를 colour의 값으로 지정합니다.
geom_violin(width=0.8) +
ggtitle("차종과 생산지 별 바이올린 그래프 : colour")
11.4.12.2 facet_grid()
함수의 이용
첫 번째 기준으로 차종(Type
)을 그리고 두 번째 기준으로 생산지(Origin
)로 해서 바이올린 그래프를 그리고자 하는 경우, facet_grid(Origin ~ Type)
으로 설정해 줍니다.
# 두 기준/그룹별 바이올린 그래프 그리기 : facet_grid() 함수의 이용
ggplot(Cars93,
aes(x = Type, # Type 변수를 X로 지정합니다.
y = Price,
fill = Origin)) + # Orgin 변수를 fill(색 채우기)의 값으로 지정합니다.
geom_violin(width=0.8, outlier.size=3, outlier.shape=16, outlier.colour="red") +
ggtitle("차종과 생산지 별 바이올린 그래프 : facet_grid()") +
facet_grid(Origin ~ Type) # Type을 첫째 기준, Origin을 둘째 기준으로 지정합니다.
## Warning: Ignoring unknown parameters: outlier.size, outlier.shape,
## outlier.colour
11.4.12.3 facet_wrap()
함수의 이용
# 두 기준/그룹별 바이올린 그래프 그리기 : facet_wrap() 함수의 이용
ggplot(Cars93,
aes(x = Type, # Type 변수를 X로 지정합니다.
y = Price,
colour = Origin)) + # Orgin 변수를 colour(테두리 선)의 값으로 지정합니다.
geom_violin(width=0.8, outlier.size=3, outlier.shape=16, outlier.colour="red") +
ggtitle("차종과 생산지 별 바이올린 그래프 : facet_wrap()") +
facet_wrap(Origin ~ Type, ncol = 6) # Type을 첫째 기준, Origin을 둘째 기준으로 지정합니다.
## Warning: Ignoring unknown parameters: outlier.size, outlier.shape,
## outlier.colour
11.4.13 Theme의 사용
히스토그램과 커널 밀도 곡선에서 Theme을 사용하였듯이, 바이올린 그래프에서도 Theme을 사용할 수 있습니다.
앞의 예에서 바이올린 그래프에 평균을 추가한 그래프에 Theme을 사용해 보겠습니다. 이 예에서도 히스토그램에서 Theme으로 사용한 ggplot2::theme_classic() +
이하 부분을 복사해서 붙여 넣기한 것입니다.
# 바이올린 그래프에 평균 추가하기 : theme_classic() 적용
ggplot(Cars93, aes(x = 1, y = Price)) +
geom_violin() +
stat_summary(fun.y = "mean", # Y축의 평균값을 산출합니다
geom = "point", # 점으로 표시합니다.
shape = 8, # 점의 모양을 8로 지정합니다.
size = 3, # 점의 크기를 지정합니다.
colour = "blue") + # 점의 색을 지정합니다.
ggtitle("바이올린 그래프에 Theme 사용") +
::theme_classic() + # 그래프 테마 지정
ggplot2::theme(axis.title.x = element_text(size = 10,
ggplot2face = "italic",
color = "gray",
angle = 0,
vjust = 0.5),
axis.title.y = element_text(size = 10,
face = "bold.italic",
color = "gray",
angle = 0,
vjust = 0.5)) + # X축과 Y축의 서식 스타일 지정
::scale_y_continuous(labels = scales::comma) # Y 값의 천단위에 콤마 표시 ggplot2
## Warning: `fun.y` is deprecated. Use `fun` instead.
- 참고자료 : ggplot2 violin plot : http://www.sthda.com/english/wiki/ggplot2-violin-plot-quick-start-guide-r-software-and-data-visualization
연습문제
1. Cars93 데이터 세트에 있는 연속형 변수를 바이올린 그래프로 시각화 하려 합니다.
1-1. MPG.city
변수에 대한 기본 바이올린 그래프를 작성하시오.
ggplot(Cars93, aes(x = 1,
y= MPG.city)) +
geom_violin() +
ggtitle("기본 바이올린 그래프 : MPG.city")
##### 1-2. 기본 바이올린 그래프를 수평으로 표시하시오. {-}
ggplot(Cars93, aes(x = 1,
y= MPG.city)) +
geom_violin() +
coord_flip() +
ggtitle("수평 기본 바이올린 그래프 : MPG.city")
1-3. MPG.city
변수에 대한 기본 바이올린 그래프에서 1) x축 이름과 구분자를 없애고, 2) 이상값(outliers)들을 13번 모양으로, 크기 3의 “blue” 색으로 표시하시오.
ggplot(Cars93, aes(x = 1,
y= MPG.city)) +
geom_violin() +
geom_boxplot(width = 0.1,
outlier.shape = 13,
outlier.size = 3,
outlier.colour = "blue") +
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
ggtitle("MPG.city 바이올린 그래프 : 이상값 표시")
1-4. 1-3.에서 작성한 바이올린 그래프에 데이터를 점들(shape = 16
)로 표시하고, position = position_jitter(width = 0.1, height = 0.1)
을 geom_jitter()
함수의 모수로 입력하시오.
ggplot(Cars93, aes(x = 1,
y= MPG.city)) +
geom_violin() +
geom_boxplot(width = 0.1,
outlier.shape = 13,
outlier.size = 3,
outlier.colour = "blue") +
scale_x_continuous(breaks = NULL) +
theme(axis.title.x = element_blank()) +
geom_jitter(shape = 16,
position = position_jitter(width = 0.1, height = 0.1)) +
ggtitle("MPG.city 바이올린 그래프 : 이상값 표시")
1-5. 기본 바이올린 그래프의 테두리 색을 “blue,” 채우기 색을 투명도 0.5의 “yellow”로 지정하시오.
ggplot(Cars93, aes(x = 1,
y= MPG.city)) +
geom_violin(colour = "blue",
fill = "yellow",
alpha = 0.5) +
ggtitle("MPG.city 바이올린 그래프 : 색 지정하기")
1-6. 1-5.에서 작성한 바이올린 그래프에 MPG.city
의 평균 값을 (shape =
) 8번의 점(point)으로, 크기(size =
) 3, 그리고 (colour =
) “red” 색으로 표시하시오.
ggplot(Cars93, aes(x = 1,
y= MPG.city)) +
geom_violin(colour = "blue",
fill = "yellow",
alpha = 0.5) +
stat_summary(fun.y = "mean",
geom = "point",
shape = 8,
size = 3,
colour = "red") +
ggtitle("MPG.city 바이올린 그래프 : 평균점 표시하기")
## Warning: `fun.y` is deprecated. Use `fun` instead.
2. MPG.city
변수에 대하여 자동차 유형(Type
) 변수를 그룹으로 하여 그룹별 바이올린 그래프를 작성하시오.
단,
- 바이올린 그래프의 테두리 색은 자동차 유형(
Type
)별로 색을 달리하시오. - 그룹별 바이올린 그래프는
aes()
함수를 이용하시오.
ggplot(Cars93,
aes(x = Type,
y = MPG.city,
colour = Type)) +
geom_violin() +
ggtitle("자동차 유형별 MPG.city 바이올린 그래프 : aes() 함수 이용")
Part 2. 그래프 모수의 [기호모양]을 참고하기 바랍니다.↩︎
Part 2. 그래프 모수의 [기호모양]을 참고하기 바랍니다.↩︎
stat_*() 함수에 대한 설명을 참고하기 바랍니다.↩︎