ggplot2: Define plot layout with grid.arrange() as argument of do.call()

48,726

You can now do,

grid.arrange(p1,p2,p3,p4, layout_matrix = rbind(c(1,1,1),c(2,3,4)))
Share:
48,726
CptNemo
Author by

CptNemo

Updated on July 17, 2020

Comments

  • CptNemo
    CptNemo almost 4 years

    I want to obtained an unbalanced grid of plots such as

    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

    but using a function

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

    and an lapply call

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

    In this case grid.arrange distribute the plots in a 2 by 2 matrix. But I want to obtain an unbalanced layout as with

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