web-dev-qa-db-fra.com

Enregistrement du tracé grid.arrange () dans un fichier

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()?
113
I Like to Code

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. .

120
baptiste

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.

38
user2B4L2

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 ...

16
JohnBee

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.

4
docjg

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()
0
TeYaP