2015-03-15 7 views
9

Ich platziere mehrere Plots in ein Bild mit gridExtra::grid.arrange und möchte die Option haben, das kombinierte Plot als ein Objekt zu speichern, das innerhalb einer Funktion als Teil zurückgegeben werden kann einer Liste zurückgegebener Objekte. Idealerweise möchte ich dies tun, ohne das Plot-Objekt zu drucken. Der folgende Code erstellt zwei Diagramme, kombiniert sie mit grid.arrange und versucht, das Ergebnis in x zu speichern. x wird jedoch zu NULL ausgewertet und die Grafik wird gedruckt. Die Dokumentation für grid.arrange zeigt mich auf arrangeGrob und schlägt vor, Plotten kann mit plot=FALSE deaktiviert werden, aber ich bekomme einen Fehler, wenn ich das versuche, weil FALSE kein Grob-Objekt ist.Ausgabe von gridExtra :: grid.arrange in ein Objekt speichern

Irgendwelche Vorschläge für das, was ich nicht verstehe?

# R under development 
# Windows 7 (32 bit) 
# ggplot2 1.0.0 
# gridExtra 0.9.1 

p1 <- ggplot(mtcars, aes(x=factor(cyl), y=mpg)) + geom_boxplot() 

p2 <- ggplot(mtcars, aes(x=factor(cyl), y=wt)) + geom_boxplot() 

x <- gridExtra::grid.arrange(p1, p2) 

x 

Per den Kommentaren, ich füge diese Bearbeitung hinzu. Wenn ich es mit arrangeGrob versuche, bekomme ich überhaupt keine Ausgabe.

> gridExtra::arrangeGrob(p1, p2) 
> print(gridExtra::arrangeGrob(p1, p2)) 
Error: No layers in plot 
> x <- gridExtra::arrangeGrob(p1, p2) 
> x 
Error: No layers in plot 
+5

Versuchen 'arrangeGrob' statt – hrbrmstr

+1

@hrbrmstr mit: Ich denke, eine kleine Antwort lohnen würde. Die Hilfeseite ist in diesem Fall eher wenig hilfreich und das hätte ich trotz einiger Erfahrungen nicht von ganzem Herzen beantworten können. –

+0

Es wird tatsächlich seltsamer mit 'arraygrob' (ich vergesse immer wieder, dass Code nicht in den Kommentaren formatiert wird, also habe ich die Frage bearbeitet). – Benjamin

Antwort

2

Der Code in Ihrer Bearbeitung funktioniert nicht richtig, da Sie nicht gridExtra geladen werden können.

library(gridExtra) 
y <- arrangeGrob(p1, p2, ncol = 1) 
class(y) 
#[1] "gtable" "grob" "gDesc" 
grid.draw(y) 

enter image description here

Edit: seit Version 2.0.0 unter meinem Kommentar über grid Abhängigkeit nicht mehr gültig ist, da grid jetzt importiert.

Edit: Mit gridExtra Version> = 2.0.0, gibt es keine Notwendigkeit zu befestigen entweder Paket,

p <- ggplot2::qplot(1,1) 
x <- gridExtra::arrangeGrob(p, p) 
grid::grid.draw(x) 
+0

Interessant. Das ist kein Verhalten, das ich erwartet hätte. Vielleicht verstehe ich den Operator '::' nicht so gut, wie ich dachte. Danke, dass du mich richtig gestellt hast. – Benjamin

+0

Sorry, nach dem Laden von 'gridExtra' brauchen Sie' gridExtra :: 'nicht, siehe Bearbeiten. Bitte schön! – tonytonov

+0

Das brauche ich 'gridExtra ::' nach dem Laden des Pakets habe ich verstanden. Ich habe den Operator '::' verwendet, weil ich diese Funktion in einem Paket habe und versuche, beim Laden meines Pakets das Laden zusätzlicher Pakete in den Suchpfad zu vermeiden. Ich hatte gedacht, dass das Laden der Bibliothek oder die Verwendung von '::' identische Ergebnisse liefern würde. Anscheinend ist das hier nicht der Fall. – Benjamin

2

Komisch, dass dies so vor kurzem gefragt wurde - ich war in dieses Problem läuft auch in dieser Woche und war in der Lage, es auf eine etwas hacky Art zu lösen, aber ich konnte keine andere Lösung finden, mit der ich glücklicher war.

Problem 1: ggplotGrob nicht

finde ich hatte sicher ggplot2 geladen zu machen. Ich verstehe nicht ganz, was passiert (Ich gebe zu, ich verstehe nicht vollständig importiert/hängt/Anhang/etc), aber das folgende behebt das. Ich wäre offen für Feedback, wenn das sehr gefährlich ist.

if (!"package:ggplot2" %in% search()) { 
    suppressPackageStartupMessages(attachNamespace("ggplot2")) 
    on.exit(detach("package:ggplot2")) 
} 

Jemand anderes zu this blog post verbunden, und ich denke, dass auch, aber aus meinem (nicht vollständig) Verständnis arbeitet, ist diese Lösung weniger schrecklich. Ich denke.

Problem 2: keine Schichten in Plot

Wie Sie auch entdeckt, dass Problem zu beheben können uns grid.arrange verwenden, aber das gibt NULL zurück und darf nicht zu einem Objekt zu speichern. Also wollte ich auch arrangeGrob verwenden, aber ich lief auch in den obigen Fehler, wenn gridExtra nicht bereits geladen war. Das erneute Anwenden des Fixes von Problem 1 scheint nicht zu funktionieren (vielleicht wird das Paket zu früh abgehängt?). ABER ich bemerkte, dass grid::grid.draw auf das Ergebnis von arrayGrob Aufruf ohne Fehler in Ordnung. Also fügte ich der Ausgabe von arrangeGrob eine benutzerdefinierte Klasse hinzu und fügte eine generische Druckmethode hinzu, die einfach das Raster aufruft.zeichnen

f <- function() { 
    plot <- gridExtra::arrangeGrob(...) 
    class(plot) <- c("ggExtraPlot", class(plot)) 
    plot 
} 
print.ggExtraPlot <- function(x, ...) { 
    grid::grid.draw(x) 
} 

Hurra, jetzt kann ich ohne Pakete explizit geladen, eine neue R-Sitzung öffnen und ich kann eine Funktion erfolgreich aufrufen, die eine grob erstellt und drucken Sie es später!


Sie können den Code in Aktion sehen in my package on GitHub.