web-dev-qa-db-fra.com

ggplot2: définir la disposition du tracé avec grid.arrange () comme argument de do.call ()

Je veux obtenir une grille déséquilibrée de parcelles comme

require(ggplot2)
require(gridExtra)

df <- data.frame(value1 = rnorm(200),
                 value2 = rnorm(200),
                 value3 = rnorm(200),
                 value4 = rnorm(200))

p1 <- ggplot(df) + geom_density(aes(x=value1))
p2 <- ggplot(df) + geom_density(aes(x=value2))
p3 <- ggplot(df) + geom_density(aes(x=value3))
p4 <- ggplot(df) + geom_density(aes(x=value4))

grid.arrange(p1, arrangeGrob(p2,p3,p4, ncol=3), heights=c(2.5/4, 1.5/4), ncol=1)

enter image description here

mais en utilisant une fonction

myplot <- function(i){
  p <- ggplot(df) + geom_density(aes_string(x=i))
  return(p)
}

et un appel lapply

p <- lapply(c("value1","value2","value3","value4"), myplot)
do.call(grid.arrange, c(p))

Dans ce cas grid.arrange répartit les tracés dans une matrice 2 par 2. Mais je veux obtenir une disposition déséquilibrée comme avec

grid.arrange(p1, arrangeGrob(p2,p3,p4, ncol=3), heights=c(2.5/4, 1.5/4), ncol=1)
13
CptNemo

Vous pouvez maintenant faire,

grid.arrange(p1,p2,p3,p4, layout_matrix = rbind(c(1,1,1),c(2,3,4)))
23
baptiste