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

137

J'essaie de tracer plusieurs parcelles en utilisant ggplot2, en les organisant en utilisant grid.arrange(). Depuis que j'ai réussi à trouver quelqu'un décrivant le problème exact que j'ai, j'ai cité la description du problème à partir du lien :

Quand j'utilise ggsave()après grid.arrange(), c'est à dire

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

Je n'enregistre pas le tracé de la grille mais le dernier ggplot individuel. Existe-t-il un moyen de sauvegarder le tracé tel qu'il est affiché en grid.arrange()utilisant ggsave()ou quelque chose de similaire? Autre que d'utiliser l'ancienne méthode

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 peux pas comprendre comment utiliser ggsave()pour enregistrer la sortie de l' grid.arrange()appel dans le code suivant, qui est tiré du lien :

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()?
J'aime coder
la source
6
Utilisationpng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie
2
Non print(ggplot())?
IRTFM
@DWin Oui, probablement! :-)
Andrie
1
@Andrie Ce que vous proposez fonctionne, mais la résolution de l'image est très faible. Lorsque j'enregistre une seule ggplotutilisation ggsave(), la résolution de l'image est beaucoup plus élevée. Existe-t-il un moyen d'enregistrer la sortie de grid.arrange()avec une haute résolution, comme ce serait le cas s'il s'agissait d'un seul tracé enregistré avec ggsave()? Si je fournis par exemple les options, png(...,height=1600, width=2500)l'image semble très floue.
J'aime

Réponses:

142

grid.arrangedessine directement sur un appareil. arrangeGrob, d'autre part, ne dessine rien mais renvoie un grob g, auquel vous pouvez passer ggsave(file="whatever.pdf", g).

La raison pour laquelle cela fonctionne différemment des objets ggplot, où par défaut le dernier tracé est enregistré s'il n'est pas spécifié, est que ggplot2 garde une trace invisible du dernier tracé, et je ne pense pas que cela grid.arrangedevrait jouer avec ce compteur privé du paquet.

baptiste
la source
3
Quand j'essaye cela, j'obtiens une erreur me disant que g n'est pas du bon type?
Jack Aidley
@JackAidley pose une nouvelle question, avec un exemple minimum reproductible autonome, et votre sessionInfo () (assurez-vous que vous avez des versions récentes de R et des packages).
baptiste le
3
@DaveX veuillez ne pas diffuser ces informations trompeuses; plot(g)n'est pas la bonne façon d'afficher une table gtable, utilisez grid.draw(g)plutôt.
baptiste
@baptiste Merci et retravaillé: Notez que si vous essayez de voir le résultat g <-arrangeGrob(...)avec print(g)vous obtenez un tableau de texte répertoriant les objets graphiques plutôt que le graphique. Essayez grid.draw(g)de rendre le graphique sous forme de graphiques. -
Dave X
7
ggsave ne fonctionne plus avec (certains ou tous) les grobs.
vak
47

J'ai eu quelques problèmes avec la proposition de babptiste, mais je l'ai finalement obtenu. Voici ce que vous devez 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.

user2B4L2
la source
24

Un autre moyen simple d'enregistrer une grille.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 d'autres choses que des ggplots dans l'arrangement, comme des tables ...

JohnBee
la source
7

J'ai pensé que cela valait la peine d'ajouter à cela. J'ai eu des problèmes avec ce qui précède, avec ggsave produisant une erreur: "plot should be a ggplot2 plot"

Merci à cette réponse: Enregistrer un graphique avec ggsave après avoir utilisé ggplot_build et ggplot_gtable J'ai un amendement au 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 ça marche bien pour moi.

docjg
la source
J'avais besoin de ça. Apparemment, la version de développement de ggplot2 supprime la classe-test-fault comme ceci, mais la version CRAN actuellement (2015-10-21) ne le fait pas.
Dave X
2
Cela fonctionne avec marrangeGrob pour moi, mais pas avec arrangeGrob ou grid.arrange. @ DaveX, avez-vous besoin de faire autre chose pour le faire fonctionner en plus de modifier ggsave comme indiqué ci-dessus? Merci!
k13
3

Vous n'avez pas besoin d'utiliser arrangeGrob, vous pouvez affecter le résultat de grid.arrange directement à un tracé et l'enregistrer en utilisant ggsave:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)
RégressionÉcureuil
la source
2

Une autre solution simple: juste après votre grid.arrange()

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

tu fais un dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
TeYaP
la source