grid.arrange를 사용하여 플롯의 변수 목록을 어떻게 정렬합니까?


92
library(ggplot2)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above.

grid.arrange()in을 사용하여 플롯을 정렬하고 싶습니다 gridExtra.

의 플롯 수가 plist가변적 이라면 어떻게해야 합니까?

이것은 작동합니다 : grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

하지만 좀 더 일반적인 해결책이 필요합니다. 생각?

답변:


139

이건 어때:

library(gridExtra)
n <- length(plist)
nCol <- floor(sqrt(n))
do.call("grid.arrange", c(plist, ncol=nCol))

여기에 이미지 설명 입력


이것은 함수가 NULL 객체를 처리 할 수 ​​없다는 점을 제외하면 좋습니다.
Roman Luštrik

조롱. 사랑해. 지금까지 이것에 2 시간을 보냈습니다. 이것이 작동하지 않는 이유를 설명해 주시겠습니까? 다음 grid.arrange(plist[[1:length(plist)]], ncol = nCol))과 같은 오류가 발생합니다. Error in hl.plots[[1:12]] : no such index at level 3감사합니다!
Anto 2015 년

2
@Anto 해당 코드에 몇 가지 문제가있는 것 같지만 표시된 오류를 제공하는 것은 아마도 여기에 표시된 것과 같은 종류의 오류로 인한 것일 수 있습니다 x <- list(1,2); x[[3:1]].. 더 광범위하게 는 부분 집합을 수행 plist[...]하는 것보다 비슷한 것을 사용 plist[[...]]하십시오. 그런 다음을 사용합니다 do.call(). grid.arrange()는 목록을 첫 번째 인수 로 사용하도록 설정되지 않았기 때문에 사용해야 합니다. 건배, 행운을 빕니다!
Josh O'Brien

31

각 함수 의 인수를 사용하여 목록을 지정하는 한 grid.arrange()arrangeGrob()목록 과 함께 사용할 수 있습니다 grobs =. 예를 들어 당신이 준 예에서 :

library(ggplot2)
library(gridExtra)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

grid.arrange(grobs = plist, ncol = 2) ## display plot
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2))  ## save plot

1
이 답변을 찾는 데 너무 오래 걸렸습니다 ... 감사합니다! 이것은 가장 간단합니다.
Matt L.

16

완전성을 위해 (그리고 이미 답변 된이 오래된 질문 이 최근에 부활 됨에 따라) cowplot패키지를 사용하여 솔루션을 추가하고 싶습니다 .

cowplot::plot_grid(plotlist = plist, ncol = 2)

여기에 이미지 설명 입력


왜이 코드를 사용하여 플롯의 목록을 통과 어떤 생각이 오류를 반환 Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie

플롯은 어떻게 생성 되었습니까? 은 Using ggplot2패키지 또는 기본 그래픽을?
Uwe

ggplot2. grid.arrange거의 나를 위해 일했지만 내 플롯 목록이 채워지지 않는 것으로 나타났습니다. 문제를 질문으로 게시했습니다 : stackoverflow.com/questions/43216262/… . 그뿐만 아니라 cowplot에 대한 문제가 있었을 경우에 따라서, 궁금
geog_newbie

10

질문이 gridExtra 패키지를 사용하는 것을 구체적으로 언급한다는 것을 알고 있지만 패치 워크 패키지 의 wrap_plots함수는 가변 길이 목록을 처리하는 좋은 방법입니다.

library(ggplot2)
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

wrap_plots(plist)

여기에 이미지 설명 입력

유용한 점은 필요한 열 수를 지정할 필요가 없으며 열과 행의 수를 동일하게 유지하는 것을 목표로한다는 것입니다. 예를 들면 :

plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1)
wrap_plots(plist) # produces a 4 col x 4 row plot

여기 에서 패치 워크 패키지 에 대해 자세히 알아보십시오.


당신이 여기에 언급 한 것을 나는 패키지를 설치할 수없는 것
baxx

위에 주석 처리 된 설치 줄을 실행 해 보셨습니까 devtools::install_github("thomasp85/patchwork")?
Michael Harper

고마워요. RStudio에서 설치를 사용하려고했습니다.
baxx

1
이 패키지는 아직 CRAN에서 사용할 수 없으므로 GitHub를 통해 설치해야합니다. 그것이 훌륭한 패키지이기 때문에 더 이상 오래 걸리지 않을 것입니다!
Michael Harper

1

모든 플롯을 한 페이지에 맞추려면 다음과 같이 열과 행의 수를 계산할 수 있습니다.

x = length(plots)

cols = round(sqrt(x),0)
rows = ceiling(x/cols)

대부분의 다중 플로팅 함수에는 ncol 및 nrow가 인수로 있으므로 여기에 넣을 수 있습니다. 나는 ggpubr의 ggarrange를 좋아합니다.

ggarrange(plotlist = plots, ncol=cols, nrow = rows)

이것은 열보다 더 많은 행을 선호하므로 반대를 원하면 반대로하십시오. 즉, 6 개의 플롯에 대해 3 개의 행과 2 개의 열을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.