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()
中使用gridExtra
排列图表。
如果plist
中的绘图数量可变,我该怎么做?
这有效:
grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])
但我需要一个更通用的解决方案。想法?
答案 0 :(得分:99)
这个怎么样:
library(gridExtra)
n <- length(plist)
nCol <- floor(sqrt(n))
do.call("grid.arrange", c(plist, ncol=nCol))
答案 1 :(得分:18)
只要您在每个函数中使用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
答案 2 :(得分:11)
为了完整起见(以及这个旧的,已经回答的问题has been revived, recently),我想使用cowplot
包添加解决方案:
cowplot::plot_grid(plotlist = plist, ncol = 2)
答案 3 :(得分:5)
我知道这个问题具体是使用 gridExtra 软件包提出的,但是 patchwork 软件包中的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
了解有关 Patchwork 软件包here
的更多信息
答案 4 :(得分: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列,而不是相反。