Ich versuche, mehrere Diagramme mit zu zeichnen ggplot2
und 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()?
png(); grid.arrange(); ggplot(); ggplot(); dev.off()
print(ggplot())
?ggplot
mit speichereggsave()
, ist die Auflösung des Bildes viel höher. Gibt es eine Möglichkeit, die Ausgabegrid.arrange()
mit einer hohen Auflösung zu speichern , als wäre es ein einzelner Plot, mit dem gespeichert wirdggsave()
? Wenn ich zum Beispiel die Optionenpng(...,height=1600, width=2500)
zur Verfügung stelle, sieht das Bild sehr verschwommen aus.Antworten:
grid.arrange
zeichnet direkt auf ein Gerät.arrangeGrob
Auf der anderen Seite zeichnet nichts, sondern gibt einen Grob zurückg
, an den Sie weitergeben könnenggsave(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.arrange
dieser Zähler privat für das Paket sein sollte.quelle
plot(g)
ist nicht der richtige Weg, um eine gtable anzuzeigen, verwenden Siegrid.draw(g)
stattdessen.g <-arrangeGrob(...)
mit zu sehenprint(g)
, eine Texttabelle erhalten, in der die Grafikobjekte und nicht die Grafik aufgelistet sind . Versuchen Siegrid.draw(g)
, die Grafik als Grafik zu rendern. -Ich hatte einige Probleme mit dem Vorschlag von babptiste, bekam ihn aber endlich. Folgendes sollten Sie verwenden:
Das sollte gut funktionieren.
quelle
Eine andere einfache Möglichkeit, eine grid.arrange in einer PDF-Datei zu speichern, ist die Verwendung von pdf ():
Es ermöglicht das Zusammenführen anderer Dinge als ggplots in der Anordnung, wie z. B. Tabellen ...
quelle
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.
Die obige Zeile wurde benötigt, um den Fehler zu beheben
Jetzt funktioniert es gut für mich.
quelle
Sie müssen arrangGrob nicht verwenden, Sie können das Ergebnis von grid.arrange direkt einem Plot zuweisen und dieses mit ggsave speichern:
quelle
Eine weitere einfache Lösung: direkt nach Ihrem
grid.arrange()
du machst ein
dev.copy()
quelle