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()?
png(); grid.arrange(); ggplot(); ggplot(); dev.off()
print(ggplot())
?ggplot
utilisationggsave()
, la résolution de l'image est beaucoup plus élevée. Existe-t-il un moyen d'enregistrer la sortie degrid.arrange()
avec une haute résolution, comme ce serait le cas s'il s'agissait d'un seul tracé enregistré avecggsave()
? Si je fournis par exemple les options,png(...,height=1600, width=2500)
l'image semble très floue.Réponses:
grid.arrange
dessine directement sur un appareil.arrangeGrob
, d'autre part, ne dessine rien mais renvoie un grobg
, auquel vous pouvez passerggsave(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.arrange
devrait jouer avec ce compteur privé du paquet.la source
plot(g)
n'est pas la bonne façon d'afficher une table gtable, utilisezgrid.draw(g)
plutôt.g <-arrangeGrob(...)
avecprint(g)
vous obtenez un tableau de texte répertoriant les objets graphiques plutôt que le graphique. Essayezgrid.draw(g)
de rendre le graphique sous forme de graphiques. -J'ai eu quelques problèmes avec la proposition de babptiste, mais je l'ai finalement obtenu. Voici ce que vous devez utiliser:
Cela devrait bien fonctionner.
la source
Un autre moyen simple d'enregistrer une grille.arrange dans un fichier pdf consiste à utiliser pdf ():
Cela permet de fusionner d'autres choses que des ggplots dans l'arrangement, comme des tables ...
la source
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.
La ligne ci-dessus nécessaire pour corriger l'erreur
Maintenant ça marche bien pour moi.
la source
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:
la source
Une autre solution simple: juste après votre
grid.arrange()
tu fais un
dev.copy()
la source