web-dev-qa-db-fra.com

Tracé combiné de ggplot2 (pas dans un seul tracé), en utilisant la fonction par () ou layout ()?

J'ai pensé à utiliser les fonctions par () ou layout () pour combiner ggplots. Sera-t-il possible d'utiliser ces fonctions?

Disons que je veux tracer ggplot pour nuage de points et ggplot pour histogramme. Et je veux combiner les deux parcelles (PAS DANS UNE PARCELLE SIMPLE). Est-ce applicable?

Je l'ai essayé avec un tracé simple en R, sans utiliser les fonctions ggplot. Et cela fonctionne réellement.

Voici un exemple de Quick-R, Link: http://www.statmethods.net/advgraphs/layout.html

# 4 figures arranged in 2 rows and 2 columns
attach(mtcars)
par(mfrow=c(2,2))
plot(wt,mpg, main="Scatterplot of wt vs. mpg")
plot(wt,disp, main="Scatterplot of wt vs disp")
hist(wt, main="Histogram of wt")
boxplot(wt, main="Boxplot of wt")

# One figure in row 1 and two figures in row 2
attach(mtcars)
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
hist(wt)
hist(mpg)
hist(disp)

Mais lorsque j'essaie d'utiliser ggplot et de combiner l'intrigue, je n'obtiens pas de sortie.

24
Al-Ahmadgaid Asaad
library(ggplot2)
library(grid)


vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)


plot1 <- qplot(mtcars,x=wt,y=mpg,geom="point",main="Scatterplot of wt vs. mpg")
plot2 <- qplot(mtcars,x=wt,y=disp,geom="point",main="Scatterplot of wt vs disp")
plot3 <- qplot(wt,data=mtcars)
plot4 <- qplot(wt,mpg,data=mtcars,geom="boxplot")
plot5 <- qplot(wt,data=mtcars)
plot6 <- qplot(mpg,data=mtcars)
plot7 <- qplot(disp,data=mtcars)

# 4 figures arranged in 2 rows and 2 columns
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 2)))
print(plot1, vp = vplayout(1, 1))
print(plot2, vp = vplayout(1, 2))
print(plot3, vp = vplayout(2, 1))
print(plot4, vp = vplayout(2, 2))


# One figure in row 1 and two figures in row 2
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 2)))
print(plot5, vp = vplayout(1, 1:2))
print(plot6, vp = vplayout(2, 1))
print(plot7, vp = vplayout(2, 2))
32
Maiasaura

Je pense qu'un utilitaire mérite plus d'attention car il s'agit du layOut anciennement du paquet wq (notez le "O" majuscule). Il a depuis été supprimé du package wq, j'ai donc mis le code ci-dessous et l'ai renommé lay_out pour correspondre au style ggplot typique. C'est comme base::layout en ce que les parcelles peuvent être de différentes tailles, disposées en lignes et en colonnes. Chaque argument à lay_out est une liste à 3 éléments composée du tracé, des indices de ligne dans lesquels le tracer et des indices de colonne dans lesquels le tracer.

Par exemple, en utilisant les tracés de @Paul McMurdie,

lay_out(list(plot1, 1, 1),
        list(plot2, 1, 2),
        list(plot3, 2, 1),
        list(plot4, 2, 2),
        list(plot5, 3, 1:2),
        list(plot6, 4, 1:2),
        list(plot7, 1:2, 3))

enter image description here

lay_out = function(...) {    
    x <- list(...)
    n <- max(sapply(x, function(x) max(x[[2]])))
    p <- max(sapply(x, function(x) max(x[[3]])))
    grid::pushViewport(grid::viewport(layout = grid::grid.layout(n, p)))    

    for (i in seq_len(length(x))) {
        print(x[[i]][[1]], vp = grid::viewport(layout.pos.row = x[[i]][[2]], 
            layout.pos.col = x[[i]][[3]]))
    }
} 

(Code provenant d'une version antérieure du package wq, du historique des validations sur le miroir CRAN Github non officiel .)

13
Gregor Thomas

La réponse impliquant grid.layout fonctionne, je l'ai utilisé et j'ai voté pour. Cependant, je trouve généralement cette solution beaucoup trop fastidieuse et sujette aux erreurs, et je soupçonne que la plupart des passionnés de ggplot2 qui le font régulièrement l'ont enveloppé dans une fonction. J'ai trouvé plusieurs de ces fonctions d'encapsulation dans les recherches précédentes, mais ma solution actuelle est dans un package addon de grille appelé gridExtra . Il a des arguments utiles, mais la configuration par défaut des lignes/colonnes est souvent celle que vous vouliez en premier lieu:

library("ggplot2")
# Generate list of arbitrary ggplots
plot1 <- qplot(data = mtcars, x=wt, y=mpg, geom="point",main="Scatterplot of wt vs. mpg")
plot2 <- qplot(data = mtcars, x=wt, y=disp, geom="point",main="Scatterplot of wt vs disp")
plot3 <- qplot(wt,data=mtcars)
plot4 <- qplot(wt,mpg,data=mtcars,geom="boxplot")
plot5 <- qplot(wt,data=mtcars)
plot6 <- qplot(mpg,data=mtcars)
plot7 <- qplot(disp,data=mtcars)
# You might have produced myPlotList using instead lapply, mc.lapply, plyr::dlply, etc 
myPlotList = list(plot1, plot2, plot3, plot4, plot5, plot6, plot7)
library("gridExtra")
do.call(grid.arrange,  myPlotList)

Remarquez comment le code réel "combiner mes tracés en un seul graphique" était une ligne (après le chargement de gridExtra). Vous pourriez faire valoir que mettre les parcelles dans une liste était une ligne supplémentaire, mais en fait j'aurais pu utiliser alternativement

grid.arrange(plot1, plot2, plot3, plot4, plot5, plot6, plot7)

Pour un petit nombre de ggplots, cela peut être préférable. Cependant, pour n_plots > 4 vous commencerez à ne pas avoir à les nommer et à les saisir tous.

7
Paul McMurdie