2017-02-19 23 views
0

Я пытаюсь создать автоматизированную функцию построения графиков и есть несколько вопросов о прокладке графиков из списков в ggplot2 с помощью grid.arrangeСоздание сетки ggplot графиков из списка с помощью gridExtra

Вот игрушка данные

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». Чтобы передать список объектов сюжета в любую из функций, используйте аргумент 'grobs':' grid.arrange (grobs = gg, ncol = 3) '. – eipi10

ответ