Speichern des Diagramms grid.arrange () in einer Datei

137

Ich versuche, mehrere Diagramme mit zu zeichnen ggplot2und sie mit anzuordnen grid.arrange(). Da ich jemanden gefunden habe, der das genaue Problem beschreibt, habe ich aus der Problembeschreibung unter dem Link zitiert :

Wenn ich ggsave()nach grid.arrange(), dh

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

Ich speichere nicht das Gitterdiagramm, sondern das letzte einzelne ggplot. Gibt es eine Möglichkeit, den Plot tatsächlich so zu speichern, wie er mit grid.arrange()using ggsave()oder ähnlichem angezeigt wird ? Anders als auf die ältere Art und Weise

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

Der gleiche Link gibt die folgende Lösung:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

Ich kann jedoch nicht herausfinden, wie ggsave()die Ausgabe des grid.arrange()Aufrufs im folgenden Code gespeichert werden soll, der aus dem Link stammt :

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?
Ich mag es zu codieren
quelle
6
Verwenden Siepng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie
2
Nicht print(ggplot())?
IRTFM
@ DWin Ja, wahrscheinlich! :-)
Andrie
1
@Andrie Was Sie vorschlagen, funktioniert, aber die Auflösung des Bildes ist sehr niedrig. Wenn ich eine einzelne ggplotmit speichere ggsave(), ist die Auflösung des Bildes viel höher. Gibt es eine Möglichkeit, die Ausgabe grid.arrange()mit einer hohen Auflösung zu speichern , als wäre es ein einzelner Plot, mit dem gespeichert wird ggsave()? Wenn ich zum Beispiel die Optionen png(...,height=1600, width=2500)zur Verfügung stelle, sieht das Bild sehr verschwommen aus.
Ich mag Code

Antworten:

142

grid.arrangezeichnet direkt auf ein Gerät. arrangeGrobAuf der anderen Seite zeichnet nichts, sondern gibt einen Grob zurück g, an den Sie weitergeben können ggsave(file="whatever.pdf", g).

Der Grund, warum es anders funktioniert als bei ggplot-Objekten, bei denen standardmäßig der letzte Plot gespeichert wird, wenn er nicht angegeben wird, ist, dass ggplot2 den neuesten Plot unsichtbar verfolgt, und ich denke nicht, dass grid.arrangedieser Zähler privat für das Paket sein sollte.

Baptiste
quelle
3
Wenn ich das versuche, erhalte ich eine Fehlermeldung, dass g nicht vom richtigen Typ ist?
Jack Aidley
@JackAidley stellt eine neue Frage mit einem in sich geschlossenen reproduzierbaren Beispiel und Ihrer sessionInfo () (stellen Sie sicher, dass Sie über aktuelle Versionen von R und Paketen verfügen).
Taufe
3
@ DaveX, bitte verbreiten Sie diese irreführenden Informationen nicht. plot(g)ist nicht der richtige Weg, um eine gtable anzuzeigen, verwenden Sie grid.draw(g)stattdessen.
Taufe
@baptiste Danke & überarbeitet: Beachten Sie, dass Sie beim Versuch, das Ergebnis von g <-arrangeGrob(...)mit zu sehen print(g), eine Texttabelle erhalten, in der die Grafikobjekte und nicht die Grafik aufgelistet sind . Versuchen Sie grid.draw(g), die Grafik als Grafik zu rendern. -
Dave X
7
ggsave arbeitet nicht mehr mit (einigen oder allen) Grobs.
Vak
47

Ich hatte einige Probleme mit dem Vorschlag von babptiste, bekam ihn aber endlich. Folgendes sollten Sie verwenden:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

Das sollte gut funktionieren.

user2B4L2
quelle
24

Eine andere einfache Möglichkeit, eine grid.arrange in einer PDF-Datei zu speichern, ist die Verwendung von pdf ():

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

Es ermöglicht das Zusammenführen anderer Dinge als ggplots in der Anordnung, wie z. B. Tabellen ...

JohnBee
quelle
7

Ich dachte, es lohnt sich, dies zu ergänzen. Ich hatte Probleme mit dem oben genannten, wobei ggsave einen Fehler erzeugte: "plot sollte ein ggplot2-Plot sein"

Dank dieser Antwort: Speichern eines Diagramms mit ggsave nach Verwendung von ggplot_build und ggplot_gtable Ich habe eine Änderung des obigen Codes.

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

Die obige Zeile wurde benötigt, um den Fehler zu beheben

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

Jetzt funktioniert es gut für mich.

docjg
quelle
Ich brauchte das. Anscheinend beseitigt die Entwicklungsversion von ggplot2 den Klassentestfehler wie folgt, die CRAN-Version derzeit (21.10.2015) jedoch nicht.
Dave X
2
Dies funktioniert für mich mit marrangeGrob, aber nicht mit arrangGrob oder grid.arrange. @ DaveX, mussten Sie noch etwas tun, damit es funktioniert, außer ggsave wie oben gezeigt zu ändern? Vielen Dank!
k13
3

Sie müssen arrangGrob nicht verwenden, Sie können das Ergebnis von grid.arrange direkt einem Plot zuweisen und dieses mit ggsave speichern:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)
RegressionSquirrel
quelle
2

Eine weitere einfache Lösung: direkt nach Ihrem grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

du machst ein dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
TeYaP
quelle