2017-02-19 126 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)