使用 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)
我正在尝试创建一个自动绘图功能,并且有一些关于使用 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)