2017-02-19 121 views
0

我试图创建一个自动化的图形功能和对使用grid.arrange使用gridExtra

在这里,在ggplot2从列表布局图的几个问题清单创建ggplot图的网格的玩具数据

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而无需在绘图函数中将它们转换为grobs。目前,我收到一条错误消息,说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) 
+1

不知道这是你在找什么,但你有没有试过'marrangeGrob创建图形的矩阵( gg,ncol = 3,nrow = 2)'? – GGamba

+1

'marrangeGrob'用于多页面安排。如果你想把这些图全部放在一个页面上,那么使用'grid.arrange'。要将plot对象列表传递给任一函数,请使用'grobs'参数:'grid.arrange(grobs = gg,ncol = 3)'。 – eipi10

回答

2
gridExtra::grid.arrange(grobs = gg, ncol = 3)