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

Creating a grid of ggplot graphs from a list using gridExtra

我正在尝试创建一个自动绘图功能,并且有一些关于使用 grid.arrange

ggplot2 中的列表布置图表的问题

这是玩具数据

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 = "")

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

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

现在创建两个列表

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

现在通过 foreach 函数

将这些列表传递到绘图函数中
library(foreach)
gg <- foreach(x = nameList, y = noteList) %do% gFunct(x,y)

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

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

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

创建图形矩阵
gridExtra::grid.arrange(gg, ncol = 3)

而不是

gridExtra::grid.arrange(gg[[1]], gg[[2]], gg[[3]], gg[[4]], gg[[5]], gg[[6]], ncol = 3)
gridExtra::grid.arrange(grobs = gg, ncol = 3)