본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
ggplot2

한 학급에는 얼마나 많은 학생이? 학급당 학생수- ggplot 이어 붙이기

by 아참형인간 2021. 6. 28.
patchwork.utf8

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)))

댓글