webentwicklung-frage-antwort-db.com.de

Speichern von grid.arrange () -Plot in einer Datei

Ich versuche, mehrere Plots mit ggplot2 zu zeichnen und sie mit grid.arrange()..__ zu arrangieren. Da es mir gelungen ist, jemanden zu finden, der das genaue Problem beschreibt, das ich habe, habe ich die Problembeschreibung aus link zitiert.

Wenn ich ggsave() nach grid.arrange() verwende, d. H.

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

Ich speichere nicht das Rasterplot, sondern das letzte einzelne ggplot. Gibt es eine .__-Methode, um das Diagramm tatsächlich zu speichern, wie von grid.arrange() angezeigt, mit ggsave() oder etwas Ähnlichem? Anders als bei der älteren Methode

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

Derselbe Link gibt die Lösung unten an:

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 ich mit ggsave() die Ausgabe des grid.arrange()-Aufrufs im folgenden Code speichern kann, der aus 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()?
113
I Like to Code

grid.arrange zeichnet direkt auf einem Gerät. arrangeGrob hingegen zeichnet nichts, sondern gibt ein grob g zurück, das Sie an ggsave(file="whatever.pdf", g) übergeben können.

Der Grund dafür ist anders als bei ggplot-Objekten. Standardmäßig wird der letzte Plot gespeichert, wenn er nicht angegeben wird, weil ggplot2 den neuesten Plot unsichtbar verfolgt. Ich glaube nicht, dass grid.arrange sich mit diesem Zähler privat in das Paket einarbeiten soll .

120
baptiste

Ich hatte einige Probleme mit dem Vorschlag von Baptiste, bekam es 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.

38
user2B4L2

Eine andere einfache Methode zum Speichern einer grid.arrange in einer pdf-Datei 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 erlaubt andere Dinge als ggplots in der Anordnung zusammenzuführen, wie Tabellen ...

16
JohnBee

Ich dachte, es lohnt sich, dies hinzuzufügen. Ich hatte Probleme mit dem oben genannten, ggsave erzeugte einen Fehler: "Plot sollte ein Plot2 von Plot2 sein".

Dank dieser Antwort: Speichern eines Diagramms mit ggsave nach der 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 musste den Fehler beheben

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

Jetzt klappt es für mich gut.

4
docjg

Eine weitere einfache Lösung: Direkt nach Ihrer grid.arrange()

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

du machst eine dev.copy()

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