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

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

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



답변

이건 어때:

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

여기에 이미지 설명 입력


답변

각 함수 의 인수를 사용하여 목록을 지정하는 한 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


답변

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

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

여기에 이미지 설명 입력


답변

질문이 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

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


답변

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

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 개의 열을 제공합니다.


답변