J'essaie de tracer plusieurs tracés à l'aide de ggplot2
, en les organisant à l'aide de grid.arrange()
. Depuis que j'ai réussi à trouver une personne décrivant le problème exact que j'ai, j'ai cité la description du problème dans link :
Lorsque j'utilise ggsave()
après grid.arrange()
, c'est-à-dire.
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2) ggsave("sgcirNIR.jpg")
Je ne sauve pas le tracé de la grille mais le dernier ggplot individuel. Existe-t-il un moyen De réellement enregistrer le tracé affiché par grid.arrange()
en utilisant ggsave()
ou quelque chose de similaire? Autre que l’utilisation de l’ancienne
jpeg("sgcirNIR.jpg") grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2) dev.off()
Le même lien donne la solution ci-dessous:
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
Cependant, je ne vois pas comment utiliser ggsave()
pour enregistrer la sortie de l'appel grid.arrange()
dans le code suivant, extrait de link :
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()?
grid.arrange
dessine directement sur un périphérique. arrangeGrob
, en revanche, ne dessine rien mais retourne un grob g
, que vous pouvez passer à ggsave(file="whatever.pdf", g)
.
La raison pour laquelle cela fonctionne différemment que pour les objets ggplot, où par défaut le dernier tracé est sauvegardé s'il n'est pas spécifié, c'est que ggplot2 garde une trace invisible du dernier tracé, et que je ne pense pas que grid.arrange
devrait déconner avec ce compteur privé au paquet. .
La proposition de baptiste m'a posé quelques problèmes, mais je l'ai finalement trouvée Voici ce que vous devriez utiliser:
# 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
Cela devrait bien fonctionner.
Un autre moyen simple de sauvegarder un grid.arrange dans un fichier pdf consiste à utiliser 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
Cela permet de fusionner des choses autres que des ggplots dans l'arrangement, comme des tables ...
Je pensais que cela valait la peine d’ajouter à cela .J'ai eu des problèmes avec ce qui précède, avec ggsave en produisant une erreur:
Merci à cette réponse: Sauvegarder un graphique avec ggsave après avoir utilisé ggplot_build et ggplot_gtable .__ J'ai modifié le code ci-dessus.
# 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]
La ligne ci-dessus nécessaire pour corriger l'erreur
g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
ggsave(file="whatever.pdf", g) #saves g
Maintenant cela fonctionne pour moi bien.
Une autre solution simple: Juste après votre grid.arrange()
grid.arrange(plot1, plot2, plot3, nrow=3)
vous faites un dev.copy()
dev.copy(pdf,"whatever.pdf")
dev.off()