J'apprécierais vraiment votre aide pour le problème suivant. Je connais plusieurs façons d'enregistrer un seul tracé dans un fichier. Ma question est: comment enregistrer correctement un multiplot dans un fichier?
Pour commencer, je ne suis pas un utilisateur expérimenté de R. J'utilise ggplot2 pour créer mes tracés, et une autre chose que je devrais probablement mentionner est que j'utilise l'interface graphique RStudio. En utilisant un exemple du livre de recettes R, je peux créer plusieurs tracés dans une seule fenêtre.
Je voudrais enregistrer ce soi-disant multiplot dans un fichier (de préférence au format jpeg), mais je ne parviens pas à le faire.
Je crée le 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)
Cela 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 (en utilisant Exporter -> Enregistrer le tracé en tant qu'image), mais je voudrais tout exécuter dans un script. Je parviens à enregistrer uniquement subplot1d (qui est last_plot ()), et non le multiplot complet.
Ce que j'ai essayé jusqu'à présent:
Utiliser ggsave
ggsave(filename = "D:/R/plots/Myplots.jpg")
Il en résulte que seul le sous-tracé 1d est enregistré.
Utilisation de 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 une image complètement blanche (juste l'arrière-plan je suppose). print (Myplot) renvoie NULL.
Je ne sais pas 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 suggérer un moyen de résoudre mes problèmes?
C'est parce que Myplot
est la valeur renvoyée par votre fonction multiplot, et elle ne renvoie rien (son travail consiste à imprimer les graphiques). Vous devez appeler multiplot avec le périphérique jpeg ouvert:
jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE)
multiplot(plot1a,plot1b,plot1c,plot1d, cols=2)
dev.off()
devrait marcher.
En utilisant le exemple de code (livre de cuisine R), cela fonctionne pour moi
png("chickweight.png")
multiplot(p1, p2, p3, p4, cols=2)
dev.off()
Et par souci d'exhaustivité, ggsave
ne fonctionne pas car il enregistre uniquement le dernier objet ggplot imprimé, qui dans votre cas n'est que le dernier tracé. Cela est dû au fait que multiplot crée le tracé en dessinant les objets ggplot sur différents sous-ensembles du périphérique graphique total. Une alternative consiste à créer le tracé en combinant les objets ggplot en un seul grand objet ggplot, puis en imprimant l'objet. Ce serait compatible avec ggsave
. Cette approche est implémentée par arrangeGrob
dans le package gridExtra
.