使用gridExtra从列表创建ggplot图形网格

lle*_*lls 1 r ggplot2 gridextra

我正在尝试创建一个自动图形功能,并且有一些关于在ggplot2使用中列出图表的问题grid.arrange

这是玩具数据

set.seed(1234)
df <- data.frame(rep(NA,20))
for (i in 1:6) df[,i] <- rnorm(20, 0, 3)
names(df) <- paste("a", 1:6, sep = "")
Run Code Online (Sandbox Code Playgroud)

现在创建一个基于参数存在与否的偶然性的简单图形函数,在这种情况下是否将注释添加到图形中(注意:我这样做是为了尽可能地表示我的真实工作流程)

gFunct <- function (vec, note = NULL) {
  if(is.null(note)) {
  g <- ggplot(df, aes_string(vec)) + geom_histogram()
  return(g)
  } else {
  g <- ggplot(df, aes_string(vec)) + geom_histogram() + annotate("text", x = 0, y = 3, label = note)
  return(g)
  }
}
Run Code Online (Sandbox Code Playgroud)

现在创建两个列表

nameList <- names(df)
noteList <- list(a1 = NULL, a2 = "hey", a3 = "hey there", a4 = NULL, a5 = NULL, a6 = "there")
Run Code Online (Sandbox Code Playgroud)

现在通过该foreach函数将这些列表传递给图形函数

library(foreach)
gg <- foreach(x = nameList, y = noteList) %do% gFunct(x,y)
Run Code Online (Sandbox Code Playgroud)

我们调用时得到的gg是一个图表列表,索引为[[idx]].我想知道两件事

(1)如何将这些传递到grid.arrange图形函数中而不需要将它们变成凹凸.目前我收到一条错误消息,only 'grobs' allowed in "gList"但在其他情况下,我不需要将ggplot2图形转换为grobs以将其传递给grid.arrange.

(2)不考虑grob问题,有没有办法将整个列表传递到,grid.arrange而不必手动列出每个图形?换句话说,我希望能够创建图表矩阵

gridExtra::grid.arrange(gg, ncol = 3)
Run Code Online (Sandbox Code Playgroud)

而不是

gridExtra::grid.arrange(gg[[1]], gg[[2]], gg[[3]], gg[[4]], gg[[5]], gg[[6]], ncol = 3)
Run Code Online (Sandbox Code Playgroud)

bap*_*ste 5

gridExtra::grid.arrange(grobs = gg, ncol = 3)
Run Code Online (Sandbox Code Playgroud)