R - enregistrer multiplot de fichier
J'apprécierais vraiment de votre aide pour le problème suivant. Je sais que plusieurs façons d'enregistrer une seule parcelle à un fichier. Ma question est: Comment puis-je enregistrer correctement un multiplot à un fichier?
Pour commencer, je ne suis pas un utilisateur expérimenté de R. J'utilise ggplot2 pour créer mes parcelles, et une autre chose que je devrais probablement mentionner, c'est que j'utilise le RStudio GUI. À l'aide d'un exemple de la R livre de cuisine, je suis en mesure de créer plusieurs parcelles dans une fenêtre.
Je voudrais enregistrer ce soi-disant multiplot à un fichier (de préférence en format jpeg), mais de toute façon ce n'.
Je suis de la création de la multiplot comme suit:
##define multiplot function
multiplot <- function(..., plotlist=NULL, cols) {
require(grid)
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# Make the panel
plotCols = cols # Number of columns of plots
plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(plotRows, plotCols)))
vplayout <- function(x, y)
viewport(layout.pos.row = x, layout.pos.col = y)
# Make each plot, in the correct location
for (i in 1:numPlots) {
curRow = ceiling(i/plotCols)
curCol = (i-1) %% plotCols + 1
print(plots[[i]], vp = vplayout(curRow, curCol ))
}
}
## define subplots (short example here, I specified some more aesthetics in my script)
plot1a <- qplot(variable1,variable2,data=Mydataframe1)
plot1b <- qplot(variable1,variable3,data=Mydataframe1)
plot1c <- qplot(variable1,variable2,data=Mydataframe2)
plot1d <- qplot(variable1,variable3,data=Mydataframe2)
## plot in one frame
Myplot <- multiplot(plot1a,plot1b,plot1c,plot1d, cols=2)
Ce qui donne le résultat souhaité. Le problème se pose lorsque j'essaie d'enregistrer dans un fichier. Je peux le faire manuellement dans RStudio (à l'aide d'Exportation -> Enregistrer parcelle de l'image), mais je voudrais tout faire dans un script. J'ai réussi à enregistrer seulement subplot1d (qui est last_plot()), et de ne pas le terminer multiplot.
Ce que j'ai essayé jusqu'à présent:
-
À l'aide de ggsave
ggsave(filename = "D:/R/plots/Myplots.jpg")
Cette seule intrigue secondaire 1d être sauvé.
-
Jpeg(), print() et dev.off()
jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE) print(Myplot) dev.off()
Il en résulte un tout blanc de l'image (juste le fond je suppose). print(Myplot) renvoie la valeur NULL.
Pas sûr de ce que je fais mal ici. Mon manque de compréhension de R est la raison pour laquelle je suis coincé à essayer de trouver une solution. Quelqu'un peut-il expliquer ce que je fais mal et peut-être proposer un moyen de résoudre mon problème(s)?
- Vous pouvez également utiliser gridExtra::grille.organiser(plot1a,plot1b,plot1c,plot1d, ncol = 2)
- Le gridExtra package ne contient pas de grille.organiser, il ne contient pas de arrangeGrob qui semble offrir les mêmes fonctionnalités. J'ai aussi semble me rappeler une fonction appelée grille.organiser, peut-être que l'auteur a changé la fonction des titres dans le package.
grid.arrange
devrait être dans gridExtra. Incidemment, l'un des avantages dearrangeGrob
vsmultiplot
est qu'il est compatible avecggsave
, et que vous pouvez stocker le composite grob pour une utilisation ultérieure.- Je veux juste mentionner que le jpeg est probablement pas le meilleur choix. Si l'intrigue devrait se retrouver comme une image raster (et pas, par exemple, pdf ou eps), utilisez plutôt le format png. Il utilise une compression sans perte, c'est à dire il n'y aura pas d'artefacts autour de contraste des régions telles que du texte ou des lignes. Sa compression fonctionne également idéal pour les images avec de grandes zones d'une seule couleur, comme les parcelles.
Vous devez vous connecter pour publier un commentaire.
Son parce que
Myplot
est la valeur retournée par votre multiplot fonction, et il ne retourne rien (son travail est d'imprimer les graphiques). Vous devez appeler multiplot avec le jpeg de l'appareil ouvert:devrait fonctionner.
À l'aide de la exemple de code (R livre de cuisine), ça fonctionne pour moi
multiplot
pour retourner un objet de grille. Il se pourrait quegrid.arrange
ne montrent ce comportement?grid.arrange
montrent le même comportementpng
.Et par souci d'exhaustivité,
ggsave
ne fonctionne pas comme il seulement d'économiser de la dernière impression ggplot objet, qui dans votre cas est juste la dernière parcelle. Ceci est causé par le fait que multiplot crée la parcelle par le dessin de la ggplot objets sur différents sous-ensembles du total de périphériques graphiques. Une alternative est de créer de la parcelle par la combinaison de la ggplot objets dans une grande ggplot objet, et l'impression de l'objet. Cela serait compatible avecggsave
. Cette approche est mise en œuvre pararrangeGrob
dans legridExtra
paquet.arrangeGrob
ne pas créer "un grand ggplot objet", il renvoie une gTree de la classe "organiser", et si il y a ggplots dans la liste des enfants, la classe hérite également du "ggplot" pour tromper ggsave.