2017-01-26 9 views
0

Ich möchte viele Plots von ggplot2 in ein einziges PDF plotten können. Ich habe unten einen reproduzierbaren Code erstellt, der die Fehlermeldung erzeugt, die ich erhalte.Mehrere ggplot2 Plots zu einem PDF zusammenfügen

m <- matrix(data=cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow=30, ncol=3) 
df <- as.data.frame(m) 
dfs <- stack(df) 
uniqueplot1=ggplot(dfs, aes(x=values)) + geom_density() 
uniqueplot2=ggplot(dfs, aes(x=values)) + geom_density() 

objects=ls() 
plot_search=grep("uniqueplot",objects) 
objects=objects[plot_search] 

pdf("plots.pdf") 
grid.arrange(objects,ncol=2) 
dev.off() 

Der Fehler, die ich erhalte ist:

Error in gList(list("uniqueplot1", "uniqueplot2", wrapvp = list(x = 0.5, : 
    only 'grobs' allowed in "gList" 
In addition: Warning message: 
In grob$wrapvp <- vp : Coercing LHS to a list 

Gibt es eine Möglichkeit das Element objects in den richtigen Objekttyp zu konvertieren, so dass sie erfolgreich mit grid.arrange verwendet werden können?

EDIT: Dies ist ein vereinfachtes Beispiel - im wirklichen Leben werde ich Hunderte von Plots produzieren, und es wird nicht möglich sein, alle diese einzeln aufzulisten.

+0

Wäre so etwas wie: 'grid.arrange (uniqueplot1, uniqueplot2, ncol = 2)' Arbeit? –

+0

Ein anderer Ansatz: Haben Sie früher schon RMarkdown benutzt? – Wietze314

Antwort

1

Verwenden lapply(objects, get), um eine Liste mit Ihnen ggplot Objekt zu erstellen (da objects der "uniqueplot1" "uniqueplot2" ein Vektor von zwei Zeichen enthält, aber nicht die zugrundeliegenden Objekte), wie im folgenden Beispiel:

m <- matrix(data = cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow =30, ncol = 3) 
df <- as.data.frame(m) 
dfs <- stack(df) 

uniqueplot1 <- ggplot(dfs, aes(x = values)) + geom_density() 
uniqueplot2 <- ggplot(dfs, aes(x = values)) + geom_density() 
objects  <- ls() 
plot_search <- grep("uniqueplot",objects) 
objects  <- objects[plot_search] 

pdf("plots.pdf") 
gridExtra::grid.arrange(grobs = lapply(objects, get), ncol = 2) 
dev.off() 
+0

Es ist wichtig, dass ich die Funktion der Suche durch ls() behalte, da ich im realen Beispiel Hunderte von Plots aus mehreren Loops erstellen werde und es nicht möglich wäre, sie alle einzeln aufzulisten. – IcedCoffee

+1

Ok, Sie können 'do.call (gridExtra :: grid.arrange, c (lapply (objects, get), list (ncol = 2)))' 'verwenden. Ich habe meine Antwort entsprechend geändert –

+0

Seien Sie auch vorsichtig, weil Ihre endgültigen 'Objekte' in Ihrem Skript nicht die beiden Objekte' uniqueplot1' und 'uniqueplot2' enthalten, sondern nur der Vektor dieser beiden Namen. –

0

Nun, die R idiom wäre, Ihre Ergebnisse aus Listen in Listen statt direkt in der Umgebung zu speichern und dann die gewünschten Elemente aus den Listen auszuwählen. Sie könnten dann den Parameter grobs von grid.arrange verwenden. So etwas musst du an dein Beispiel anpassen.

myplots <- lapply(variables, function(v) 
       ggplot(ggplot(dfs, aes_string(x=v)) + geom_density() 
names(myplots) <- variables 
plotme <- myplots[grep("pickme", variables)] 
grid.arrange(grobs=plotme, ncol=2) 
Verwandte Themen