본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
실전에서 바로 쓰는 시계열 데이터 처리와 분석 in R/못다한 이야기

ggplot2로 다변량 선플롯 그리기 in R

by 아참형인간 2021. 6. 20.
multiline.utf8

R을 이용하여 플롯(그래프)를 그릴때 가장 마음대로 나오지 않는 플롯이 선 플롯이다. 보통 선 플롯은 일변량으로 그리는 경우보다는 다변량으로 그리는 경우가 많기 때문에 한 플롯내에서 여러 변량을 어떻게 다루는가가 매우 중요하다. 이 포스트에서는 ggplot2 패키지를 사용하여 다변량 선 플롯을 만드는 두가지 방법에 대해 살펴보고자 한다.

ggplot2 패키지를 사용하여 다변량 선 플롯을 그리는 방법은 긴(long) 형태의 데이터프레임을 사용하는 방법과 geom_line()을 여러번 사용하여 그리는 두가지 방법이 있다.

먼저 실습에 사용할 데이터를 로딩하겠다.

students.all <- read_excel("./students.xlsx", skip = 16, na = '-', sheet = 1, col_types = c('text', 'text', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric','numeric', 'numeric', 'numeric'))

students <- students.all %>%
  filter(지역규모 == '계') %>% select(-지역규모)

students$연도 <- as.factor(students$연도)

1. 긴(long) 데이터 프레임

R에서 가장 권장하는 데이터 구성방법은 간결한(tidy) 데이터 형태로 데이터를 표현하는 것이다. 이렇게 표현된 데이터를 tidy data라고 표현하는데 다음과 같이 구성될때 tidy data라고 한다.

  1. 각각의 변수는 하나의 열로 구성된다.
  2. 각각의 관찰값은 하나의 행으로 구성된다.
  3. 하나의 값은 각각의 셀로 구성된다.

긴(long) 형태의 데이터프레임은 tidy한 데이터프레임의 여러개의 변수열을 하나의 열로 병합하여 행이 많아져서 전체적인 구조가 아래로 길어지는 형태를 말한다.

tidy한 데이터프레임을 긴 형태의 데이터프레임으로 변환할 때 사용하는 함수가 gather()이다.

앞에서 로딩한 students 데이터프레임은 tidy한 형태이다.

students %>% 
  select(c('연도', '유치원', '초등학교', '중학교', '고등학교계')) %>%
  print
## # A tibble: 22 x 5
##    연도  유치원 초등학교  중학교 고등학교계
##    <fct>  <dbl>    <dbl>   <dbl>      <dbl>
##  1 1999  534166  3935537 1896956    2251140
##  2 2000  545263  4019991 1860539    2071468
##  3 2001  545142  4089429 1831152    1911173
##  4 2002  550256  4138366 1841030    1795509
##  5 2003  546531  4175626 1854641    1766529
##  6 2004  541713  4116195 1933543    1746560
##  7 2005  541603  4022801 2010704    1762896
##  8 2006  545812  3925043 2075311    1775857
##  9 2007  541550  3829998 2063159    1841374
## 10 2008  537822  3672207 2038611    1906978
## # ... with 12 more rows

이 데이터에서 유치원, 초등학교, 중학교, 고등학교계 열만을 사용하여 프레임을 다음과 같이 길게 만들수 있다.

students.long <- students %>% 
  gather(category, values, -연도) %>%
  filter(category %in% c('연도', '유치원', '초등학교', '중학교', '고등학교계')) %>%
  print
## # A tibble: 88 x 3
##    연도  category values
##    <fct> <chr>     <dbl>
##  1 1999  유치원   534166
##  2 2000  유치원   545263
##  3 2001  유치원   545142
##  4 2002  유치원   550256
##  5 2003  유치원   546531
##  6 2004  유치원   541713
##  7 2005  유치원   541603
##  8 2006  유치원   545812
##  9 2007  유치원   541550
## 10 2008  유치원   537822
## # ... with 78 more rows

길게 만든 students.long 데이터프레임을 ggplot2를 사용하여 유치원, 초등학교, 중학교, 고등학교계가 같이 표현되는 다변량 선 틀롯을 다음과 같이 그릴 수 있다.

students.long %>% 
  ggplot(aes(x = 연도, y = values)) +
  geom_line(aes(group = category))

위의 코드에서 주의깊게 살펴야하는 부분이 geom_line()gruop 매개변수이다. 앞에서 긴 형태로 만들때 여러 열을 병합하여 만든 열을 group 매개변수로 설정한 다는 점이다.

이 플롯에는 모두 같은 색깔의 선이 그려지기 때문에 각 변량을 구분할 수 없다. 따라서 색이나 라인 형태로 각 변량을 구분해줄 필요가 있다.

students.long %>% 
  ggplot(aes(x = 연도, y = values)) +
  geom_line(aes(group = category, color = category, linetype = category))

이 경우 장점은 사용하기가 쉽고 자동적으로 범례가 만들어진 다는 점이지만 단점은 grouping되는 열의 일부를 사용한다거나 색깔 설정, 라인타입 설정시에 다소 복잡한 과정을 거쳐야 한다는 점이다.

2. geom_line() 여러번 사용하기

geom_line()을 여러번 사용하여 다변량 선플롯을 그리는 경우는 tidy한 형태의 데이터가 아닐때 사용한다. 결국 geom_line()으로 그리고 싶은 데이터 열을 하나하나 설정하는 방법이다.

students %>%
  ggplot(aes(연도)) +
##  geom_line(aes(y = 학생수계, group = 1)) +
  geom_line(aes(y = 유치원, group = 1), color = 'dark grey', linetype = 1) +
  geom_line(aes(y = 초등학교, group = 1), color = 'dark grey', linetype = 1) +
  geom_line(aes(y = 중학교, group = 1), color = 'dark grey', linetype = 1) +
  geom_line(aes(y = 고등학교계, group = 1), color = 'red', linetype = 2)

위의 코드와 같이 geom_line()을 사용하여 유치원, 초등학교, 중학교, 고등학교계 열을 각각 그려주는 방식이다. 하나 주의해야할 것은 group 매개변수를 1로 설정해야한다는 점이다. 이것은 각각의 선을 하나의 그룹으로 설정한다는 의미이다.

이 경우는 앞의 코드와 같이 각 선의 형태를 각각 설정하는게 상대적으로 쉽다는 점이지만 단점은 범례나 축제목 등을 수동으로 구성해주야 한다는 점이다.

댓글