162 votes

Enregistrer le graphique grid.arrange() dans un fichier

Je tente de tracer plusieurs graphiques en utilisant ggplot2, en les disposant avec grid.arrange(). Comme j'ai réussi à trouver quelqu'un décrivant exactement le problème que j'ai, j'ai cité la description du problème à partir du lien:

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 sauvegarde pas le graphique en grille mais le dernier ggplot individuel. Existe-t-il un moyen de sauvegarder réellement le graphique tel qu'il est affiché par grid.arrange() en 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) # appareil interactif
ggsave("saving.pdf", p) # besoin de spécifier ce qu'il faut sauvegarder explicitement

Cependant, je ne parviens pas à comprendre comment utiliser ggsave() pour sauvegarder la sortie de l'appel à grid.arrange() dans le code suivant, qui est tiré de 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)

# Quel code mettre ici pour sauvegarder la sortie de grid.arrange()?

6 votes

Utilisez png(); grid.arrange(); ggplot(); ggplot(); dev.off()

2 votes

Pas print(ggplot())?

0 votes

@DWin Oui, probablement! :-)

154voto

baptiste Points 19677

grid.arrange dessine directement sur un appareil. arrangeGrob, d'autre part, 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 qu'avec les objets ggplot, où par défaut le dernier graphique est enregistré s'il n'est pas spécifié, est que ggplot2 garde invisiblement une trace du dernier graphique, et je ne pense pas que grid.arrange devrait interférer avec ce compteur privé au package.

3 votes

Lorsque j'essaie cela, je reçois une erreur me disant que g n'est pas du bon type ?

0 votes

@JackAidley posez une nouvelle question, avec un exemple minimum auto-suffisant, et votre sessionInfo() (assurez-vous d'avoir des versions récentes de R et des packages).

3 votes

@DaveX s'il vous plaît ne pas propager cette information trompeuse; plot(g) n'est pas la bonne façon d'afficher un gtable, utilisez plutôt grid.draw(g).

63voto

user2B4L2 Points 451

J'ai eu quelques problèmes avec la proposition de baptiste, mais j'ai finalement réussi. Voici ce que vous devriez utiliser:

# dessiner vos graphiques
 plot1 <- ggplot(...) # cela spécifie votre premier graphique
 plot2 <- ggplot(...) # cela spécifie votre deuxième graphique
 plot3 <- ggplot(...) # cela spécifie votre troisième graphique

# fusionner les trois graphiques dans une seule grille (et visualiser cela)
 grid.arrange(plot1, plot2, plot3, nrow=3) # arrange les graphiques dans la grille

# sauvegarder
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) # génère g
 ggsave(file="whatever.pdf", g) # enregistre g

Cela devrait bien fonctionner.

27voto

JohnBee Points 696

Une autre façon facile d'enregistrer un grid.arrange dans un fichier pdf est d'utiliser pdf():

pdf("nomdufichier.pdf", width = 8, height = 12) # Ouvre un nouveau fichier pdf
grid.arrange(plot1, plot2, plot3, nrow=3) # Écrit le grid.arrange dans le fichier
dev.off() # Ferme le fichier

Cela permet de fusionner d'autres éléments que des ggplots dans l'arrangement, comme des tables...

8voto

Vous n'avez pas besoin d'utiliser arrangeGrob, vous pouvez assigner directement le résultat de grid.arrange à un plot et sauvegarder cela en utilisant ggsave:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

7voto

docjg Points 89

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 une modification à apporter au code ci-dessus.

  # dessiner vos graphiques
 plot1 <- ggplot(...) # spécifie votre premier graphique
 plot2 <- ggplot(...) # spécifie votre deuxième graphique
 plot3 <- ggplot(...) # spécifie votre troisième graphique

 # fusionner les trois graphiques dans une seule grille (et visualiser cela)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arrange les graphiques dans la grille

 # sauvegarder
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

La ligne ci-dessus devait corriger l'erreur

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #génère g
 ggsave(file="whatever.pdf", g) #sauvegarde g

Maintenant ça marche bien pour moi.

0 votes

J'avais besoin de ça. Apparemment, la version de développement de ggplot2 supprime la classe-test-fault de cette manière, mais la version CRAN actuelle (2015-10-21) ne le fait pas.

2 votes

Cela fonctionne avec marrangeGrob pour moi mais pas avec arrangeGrob ou grid.arrange. @DaveX, avez-vous besoin de faire autre chose pour que cela fonctionne en plus de modifier ggsave comme indiqué ci-dessus ? Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X