2017-02-19 2 views
0

Ich versuche, eine automatisierte Grafikfunktion zu erstellen und ein paar Fragen über grafische Darstellungen von Listen in ggplot2grid.arrangeein Raster von ggplot Graphen aus einer Liste erstellen gridExtra mit

Hier Daten Spielzeug mit Auslegen

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

Jetzt erstellen Sie eine einfache Grafikfunktion mit einer Kontingenz basierend auf der Anwesenheit oder Abwesenheit eines Arguments, in diesem Fall, ob eine Notiz zum Diagramm hinzugefügt wird oder nicht (): Ich mache es so, um meinen realen Workflow darzustellen möglichst nah)

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

Jetzt zwei Listen

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

nun diese Listen in die Grafikfunktion über die foreach Funktion

library(foreach) 
gg <- foreach(x = nameList, y = noteList) %do% gFunct(x,y) 

Was wir bekommen, wenn wir nennen gg ist eine Liste von Graphen erstellen passieren, indexiert von [[idx]]. Ich möchte zwei Dinge wissen

(1) Wie Sie diese in grid.arrange übergeben, ohne sie in grobs in der Grafikfunktion zu verwandeln. Im Moment bekomme ich eine Fehlermeldung mit der Nachricht only 'grobs' allowed in "gList", aber bei anderen Gelegenheiten habe ich keine ggplot2 Diagramme zu grobs konvertieren müssen, um sie in grid.arrange zu übergeben.

(2) Gibt es neben dem Grob-Problem eine Möglichkeit, die gesamte Liste in grid.arrange zu übergeben, ohne jedes Diagramm manuell auflisten zu müssen? Mit anderen Worten würde Ich mag die Matrix von Graphen mit

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

statt

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

nicht sicher, es ist das, was Sie suchen, in der Lage sein zu schaffen, aber haben Sie versucht, 'marrangeGrob (gg, ncol = 3, nrow = 2) '? – GGamba

+1

'marrangeGrob' ist für mehrseitige Anordnungen. Wenn Sie die Plots alle auf einer einzelnen Seite haben möchten, verwenden Sie 'grid.arrange'. Um eine Liste von Plot-Objekten an eine der beiden Funktionen zu übergeben, verwenden Sie das Argument 'grobs':' grid.arrange (grobs = gg, ncol = 3) '. – eipi10

Antwort

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