patchwork
ggplot2
패키지를 사용해 그려진 플롯은 여러개를 동시에 그릴 수 없다. 여러개의 ggplot을 붙여 그리려면 이를 지원하는 특수 패키지인 patchwork
를 사용해야 한다.
patchwork
를 사용하려면 먼저 패키지를 설치하고 로딩해야한다.
install.packages('patchwork')
library(patchwork)
우선 ggplot
으로 플롯을 몇개 그린다. (샘플 데이터는 tidyverse를 사용한 열 선택 방법에서 사용한 시도별 행정구별 주요 교육 통계 현황(2010~2020)을 사용한다. 데이터 로딩 방법은 해당 포스트를 참조하라.) 여기서는 초등학교, 중학교, 고등학교의 학급당 학생수에 대한 밀도분포와 각 시도별 학교급별 학급당 학생수를 확인해 볼 수 있는 플롯을 생성하겠다. 이를 위해 초등학교, 중학교, 고등학교 학급당 학생수에 관한 밀도분포 함수 플롯 3종과 초등학교, 중학교, 고등학교의 지역별 학급당 학생수 막대 플롯 3종을 patchwork
를 사용하여 하나의 플롯으로 구성해본다.
학교급별 밀도분포 함수 플롯
학교급별 밀도분포 함수 플롯은 다음과 같이 생성한다.
library(tidyverse)
data %>%
filter(학교급 %in% c('초등학교')) %>%
mutate(학급당학생수 = 학생수_계_계 / 학급수_계) %>%
ggplot(aes(x = 학급당학생수, fill = 학교급)) +
geom_density(alpha = 0.3) +
labs(y = '밀도분포') +
theme(legend.position = 'none',
axis.title.x=element_blank()) -> density_초등학교
density_초등학교
data %>%
filter(학교급 %in% c('중학교')) %>%
mutate(학급당학생수 = 학생수_계_계 / 학급수_계) %>%
ggplot(aes(x = 학급당학생수, fill = 학교급)) +
geom_density(alpha = 0.3) +
labs(x = '중학교', y = '') +
theme(legend.position = 'none',
axis.title.y=element_blank(),
axis.title.x=element_blank()) -> density_중학교
density_중학교
data %>%
filter(학교급 %in% c('고등학교')) %>%
mutate(학급당학생수 = 학생수_계_계 / 학급수_계) %>%
ggplot(aes(x = 학급당학생수, fill = 학교급)) +
geom_density(alpha = 0.3) +
labs(x = '고등학교', y = '') +
theme(legend.position = 'none',
axis.title.y=element_blank(),
axis.title.x=element_blank()) -> density_고등학교
density_고등학교
학교급별 시도별 학급당 학생수 막대 플롯
학교급별 시도별 학생수 막대 플롯은 다음과 같이 생성한다.
data %>%
filter(학교급 %in% c('초등학교')) %>%
mutate(학급당학생수 = 학생수_계_계 / 학급수_계) %>%
group_by(시도) %>%
summarise(평균.학급당학생수 = mean(학급당학생수)) %>%
ggplot(aes(x = 평균.학급당학생수, y = fct_relevel(시도, '서울', '부산', '대구', '인천', '광주', '대전', '울산', '세종', '경기', '강원', '충북', '충남', '전북', '전남', '경북', '경남', '제주'))) +
geom_col(fill = 'dark blue') +
geom_text(aes(label = round(평균.학급당학생수, 2), x = 평균.학급당학생수-2.5), color = 'white', size = 2.5) +
labs(x = '초등학교 학급당학생수', y = '시도') +
scale_y_discrete(limits=rev) -> bar_초등학교
bar_초등학교
data %>%
filter(학교급 %in% c('중학교')) %>%
mutate(학급당학생수 = 학생수_계_계 / 학급수_계) %>%
group_by(시도) %>%
summarise(평균.학급당학생수 = mean(학급당학생수)) %>%
ggplot(aes(x = 평균.학급당학생수, y = fct_relevel(시도, '서울', '부산', '대구', '인천', '광주', '대전', '울산', '세종', '경기', '강원', '충북', '충남', '전북', '전남', '경북', '경남', '제주'))) +
geom_col(fill = 'dark blue') +
geom_text(aes(label = round(평균.학급당학생수, 2), x = 평균.학급당학생수-2.5), color = 'white', size = 2.5) +
labs(x = '중학교 학급당학생수', y = '시도') +
scale_y_discrete(limits=rev) +
theme(axis.title.y=element_blank()) -> bar_중학교
bar_중학교
data %>%
filter(학교급 %in% c('고등학교')) %>%
mutate(학급당학생수 = 학생수_계_계 / 학급수_계) %>%
group_by(시도) %>%
summarise(평균.학급당학생수 = mean(학급당학생수)) %>%
ggplot(aes(x = 평균.학급당학생수, y = fct_relevel(시도, '서울', '부산', '대구', '인천', '광주', '대전', '울산', '세종', '경기', '강원', '충북', '충남', '전북', '전남', '경북', '경남', '제주'))) +
geom_col(fill = 'dark blue') +
geom_text(aes(label = round(평균.학급당학생수, 2), x = 평균.학급당학생수-2.5), color = 'white', size = 2.5) +
labs(x = '고등학교 학급당학생수', y = '시도') +
scale_y_discrete(limits=rev) +
theme(axis.title.y=element_blank()) -> bar_고등학교
bar_고등학교
patchwork
를 사용하여 하나의 플롯으로 만들기
patchwork
를 사용하여 여러 ggplot
의 위치를 구성할 때에는 +
, /
, |
등의 연산자를 사용하면 쉽게 구성할 수 있다.
+
+
연산자는 플롯들을 순서대로 오른쪽으로 붙여주는 역할을 한다. 아래의 코드는 세개의 밀도함수 플롯을 하나로 붙이는 코드이다.
density_초등학교 + density_중학교 + density_고등학교
/
/
연산자는 플롯들을 순서대로 아래쪽으로 붙여주는 역할을 한다. 아래의 코드는 밀도함수 플롯 아래에 막대 플롯을 하나로 붙이는 코드이다.
density_초등학교 / bar_초등학교
앞서 생성한 6개의 플롯을 조합하여 생성한 플롯은 다음과 같다.
((density_초등학교 + density_중학교 + density_고등학교) / (bar_초등학교 + bar_중학교 + bar_고등학교))
플롯 주석 붙이기
하나로 합쳐진 플롯에 대한 다양한 설명에 대한 주석을 붙이려면 plot_annotation()
을 사용한다. plot_annotation()
에서 설정할 수 있는 주석은 다음과 같다.
title
: 하나로 합쳐진 플롯에 대한 플롯 제목을 설정한다.subtitle
: 하나로 합쳐진 플롯에 대한 플롯 부제목을 설정한다.caption
: 하나로 합쳐진 플롯에 대한 플롯 캡션을 설정한다.tag_levels
: 플롯들에 붙이는 번호를 설정한다. ‘a’, ‘A’, ‘1’, ‘i’, ’I’등의 번호를 붙일 수 있다.tag_prefix
,tag_surfix
: 플롯들에 붙이는 번호의 접두어나 접미어를 를 설정한다.theme
:ggplot
에서 사용하는 주석에 대한theme
명세를 기술한다.
위에서 생성한 최종 플롯에 주석을 붙여 생성한 최종 플롯은 다음과 같다.
((density_초등학교 + density_중학교 + density_고등학교) / (bar_초등학교 + bar_중학교 + bar_고등학교)) +
plot_annotation(title = '학교급별 학급당 학생수',
tag_levels = 'a',
caption = '(데이터 출처 : 교육통계 서비스 홈페이지)',
theme = theme(plot.title = element_text(size = 16, hjust = 0.5)))
'ggplot2' 카테고리의 다른 글
범례(legend) 꾸미기 in R : Part II (0) | 2021.10.11 |
---|---|
범례(legend) 꾸미기 in R : Part I (0) | 2021.10.02 |
벗꽃피는 순서대로 망한다? 지역별 대학생수 증감 - dumbbell 차트 (8) | 2021.08.19 |
ggplot Gallary (0) | 2021.07.15 |
우리나라 학생들은 어디로 유학가나? - 축 라벨에 이미지 붙이기 (0) | 2021.07.04 |
댓글