聰明不如鈍筆
총명불여둔필
assignment KindeR

ggplot2 그래프 이어 붙이기(feat. patchwork)


살다 보면 그래프를 여러 개 이어 붙여 그려야 할 때가 있습니다.


이럴 때 제일 먼저 생각하는 방법은 각각 그래프를 그린 다음 어도비 포토샵 같은 그래픽 프로그램으로 이미지를 붙이는 것.


나쁘지 않은 방식이지만 번거로운 것도 사실입니다.


그래서 R 세상에 'patchwork'(패치워크)라는 패키지가 나왔습니다.


이 패키지 하나만 있으면 정말 황당할 만큼 손쉽게 그래프를 붙여 그릴 수 있습니다.


새로운 패키지를 쓸 때 제일 먼저 할 일은 물론 install.packages() 함수로 설치하고 library() 함수로 불러오기.

#install.packages('patchwork')
library('patchwork')


이어서 원래 이 '최대한 친절하게 쓴 R 시리즈'에서 제일 먼저 하던 작업을 합니다.


네, tidyverse 패키지 불러오기입니다.

#install.packages('tidyverse')
library('tidyverse')
## -- Attaching packages --------------------------------------------------------------------------------- tidyverse 1.3.0 --
## √ ggplot2 3.2.1     √ purrr   0.3.2
## √ tibble  2.1.3     √ dplyr   0.8.3
## √ tidyr   0.0.3     √ stringr 1.4.0
## √ readr   1.3.1     √ forcats 0.3.0
## -- Conflicts ------------------------------------------------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()


이번 포스트는 그래프를 그리는 게 목적이 아니라 그래프를 '이어 붙이는' 게 목표니까 새로 그래프를 그리지 않겠습니다.


대신 'ggplot 산점도 위에 회귀선(식) 표시하기(feat. geom_text)' 포스트에서 썼던 그래프를 가져오겠습니다.


아래는 그냥 x축에 1~100을 넣고 y축에는 x값에 6을 곱한 뒤 표준편차(SD) 64가 나오도록 난수를 만들어 더하라는 뜻입니다. (그냥 아무 숫자나 만들라는 뜻입니다.)

set.seed(20190606)
df <- data.frame(x = c(1:100))
df$y <- 6 * df$x + rnorm(100, sd = 64)


이렇게 만든 자료를 가지고 ggplot()로 그림을 그리면 아래와 같습니다.

ggplot(df, aes(x=x, y=y)) + geom_point()


혹시 이런 그림을 그려 보고 싶으신데 어떻게 그리는지 모르겠다 싶으신 분은 '최대한 친절하게 쓴 R로 그래프 그리기(feat. ggplot2)' 포스트를 참고해 보셔도 좋습니다.


이어서 이 그래프(plot)를 p1이라는 변수에 넣겠습니다.

p1 <- ggplot(df, aes(x=x, y=y)) + geom_point()


계속해서 이 그래프에 회귀선을 넣겠습니다.

ggplot(df, aes(x=x, y=y)) + geom_point() + stat_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'


마찬가지로 이 그래프를 p2라는 변수에 담아놓도록 하겠습니다.

p2 <- ggplot(df, aes(x=x, y=y)) + geom_point() + stat_smooth()


마지막으로 이 회귀선 선형으로 바꾸겠습니다.

ggplot(df, aes(x=x, y=y)) + geom_point() + stat_smooth(method='lm')
## `geom_smooth()` using formula 'y ~ x'


이제 뭘 해야 할지 아시죠? 이 그래프는 p3에 들어갑니다.

p3 <- ggplot(df, aes(x=x, y=y)) + geom_point() + stat_smooth(method='lm')


여기까지 마치셨으면 이제 patchwork를 알아볼 준비가 됐습니다.


patchwork 사용법은 정말 간단합니다.


그래프를 옆으로 이어 붙이고 싶을 때는 플러스(+), 아래로 이어 붙이고 싶을 때는 슬래쉬(/)를 쓰시면 됩니다.


먼저 p1과 p2를 옆으로 그려보면?

p1 + p2
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'


이번에는 위아래로 붙여 보겠습니다.

p1 / p2
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'


계속해서 그래프가 세 개일 때는 어떻게 나타나는지 보겠습니다.


p1 + p2를 먼저 쓰고 p3를 나중에 쓰면?

p1 + p2 / p3
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'


p1, p2를 위에 놓고 p3를 아래에 놓고 싶을 때는 이렇게 쓰면 됩니다.

(p1 + p2) / p3
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'


거꾸로 p1이 위에 있고 p2, p3를 아래로 놓고 싶다면?

p1 / (p2 + p3)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'


어떻습니까? 정말 황당할 만큼 간단하지 않습니까?


이제 그래프를 이어 붙여 그리실 일이 있을 때는 포토샵 말고 patchwork를 찾아주세요.


그럼 Happy Charting!


댓글,

KindeR | 카테고리 다른 글 더 보기