본문 바로가기
실용적인프로그래밍/R

[ggplot] 여러 개의 그래프를 하나로 합치는 방법

by 인포메틱스 2022. 4. 7.
반응형

1. Intro

그래프를 그리다 보면, 한번에 표현시켜야 할 일이 생깁니다(특히 논문에 그림 그리실 분들 혹은 보고서 작성시).

 

다양한 그룹에서 같은 분석결과를 비교할때, 혹은 하나의 그룹에서 분석하고 결과들을 나열하고 싶을 때, 등등 다양한 이유로 한번에 표현하고 싶어합니다.

 

출처 : https://www.reneshbedre.com/blog/deseq2.html

 

 

그래서 이번 포스팅에서는 많이 이용하는 ggplot에서 나온 그래프를 하나의 그림으로 합쳐주는 패키지를 소개해볼까 합니다.

 

저번 포스팅에서 pair plot을 그리면서 사용한 grid.arrange 이외에도 다른 패키지도 소개하도록 하겠습니다.

https://mopipe.tistory.com/46

 

[R] ggplot - pair plot 그려보기 (ggplot 기초, gridExtra, ggfittext)

분석에서 사용되는 plot중에 pairplot이 있습니다. 기본적인 R에서는 pairs라는 기능을 이용하면 쉽게 만들수가 있지만, ggplot에서는 손수 만들어줘야하는 불편함 이 있습니다. (정정하겠습니다. ggplot

mopipe.tistory.com

 

본격적으로 패키지 소개를 하기 전에 연습용데이터에 대해서 설명하도록 하겠습니다.

 

데이터는 iris 데이터를 이용할 것이고 합치고 싶은 그래프들은 다음과 같이 제작하였습니다.

 

data("iris")
p1<-ggplot(data=iris)+geom_point(aes(x=Sepal.Length,y=Sepal.Width,col=Species))+theme_bw()
p2<-ggplot(data=iris)+geom_boxplot(aes(y=Sepal.Length,x=Species),position = 'identity')+theme_bw()
p3<-ggplot(data=iris)+geom_histogram(aes(y=Sepal.Length,fill=Species),position = 'identity',bins=20,alpha=0.4)+theme_bw()

 

순서대로 p1, p2, p3

 

 

 

2. gridExtra package grid.arrange function

 

기본적으로 합치는 경우 ggplot을 하나의 변수에 지정한 다음 grid.arrange에다 넣어주고, ncol로 지정을 해주면 n*m으로 알아서 만들어 줍니다.

grid.arrange(p1,p2,p3,ncol=2)

 

좀더 논문에 넣을 그림처럼 만들거면 다음과 같이 진행해도 됩니다.

p1_1=p1+labs(tag='A',title = 'iris scatter')
p2_1=p2+labs(tag='B',title = 'iris boxplot')
p3_1=p3+labs(tag='C',title = 'iris histogram')
grid.arrange(p1_1,p2_1,p3_1,ncol=2)

 

여기서 뭔가 C 부분을 조금더 크게 보여주고 싶다 하면 다음과 같이 진행하면 됩니다.

grid.arrange(arrangeGrob(p1_1,p2_1),p3_1,ncol=2)
# or
grid.arrange(p1_1,p2_1,p3_1,ncol=2,layout_matrix=cbind(c(1,2),c(3,3)))

 

그래프들의 높이와 너비도 조절이 가능합니다.

grid.arrange(p1_1,p2_1,p3_1,ncol=2,heights=c(1.4,4),widths=c(4,1.4))

물론 합치는 것도 가능합니다.

grid.arrange(p1_1,p2_1,p3_1,ncol=2,heights=c(1.4,4),widths=c(4,1.4),layout_matrix=cbind(c(1,2),c(3,3)))

 

2. cowplot package의 plot_grid function

 

다음으로는 cowplotplot_grid 를 이용해보겠습니다. 작동방식은 grid.arrange와 유사합니다.

 

약간의 차이점을 본다면 NULL이 들어가서 공백을 만들 수 있다는 점? 그리고 tag를 자동으로 혹은 수동으로 제작할 수 있다는 점? 입니다.

 

# tag를 바로 써줄 수 있음.  ## plot1
plot_grid(p1,p2,p3,labels = c('A','B','C'))
# auto로 할 경우 tag가 소문자 ## plot2
plot_grid(p1,p2,p3,labels = 'auto')
# AUTO로 할 경우 tag가 대문자  ## plot3
plot_grid(p1,p2,p3,labels = 'AUTO')
# NULL을 받는다.  ## plot3
plot_grid(p1,p2,NULL,p3,labels =  c('A','B','','C'),ncol=2)
# rel_widths, rel_heights로 높낮이 변경 가능 ## plot4
plot_grid(p1,p2,NULL,p3,labels =  c('A','B','','C'),ncol=2,rel_widths = c(1,2))

 

 

plot1, plot2

 

plot3, plot4
plot 5

3. patchwork package의 wrap_plots

 

patchwork package의 wrap_plots의 경우 찾아보면서 특징을 봐보니 아주 편리한 기능이 있는 패키지입니다.

 

wrap_plots의 경우 grid.arrange, plot_grid와 유사하게 작동이 가능한데 이패키지의 한가지 특징은 수학 기호로 그림을 조절할 수 있는 점입니다.

 

# plot 1
p1+p2
# plot 2
(p1+p2)/p3
# plot 3
p3+(p1/p2)
# plot 4
(p1/p2)-p3

 

 

 

plot1, plot2
plot3, plot4

 

tag의 경우 따로 지정을 해줘야하지만 수학 기호로 이렇게 그래프를 추가할 수가 있습니다.

728x90
반응형

댓글