web-dev-qa-db-fra.com

R - enregistrer le multiplot dans un fichier

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:

  1. Utiliser ggsave

    ggsave(filename = "D:/R/plots/Myplots.jpg")
    

    Il en résulte que seul le sous-tracé 1d est enregistré.

  2. 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?

29
M_Vermeulen

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.

22
Spacedman

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()

enter image description here

17
dickoa

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.

6
Paul Hiemstra