Top to bottom alignment of two ggplot2 figures

前端 未结 3 1869
庸人自扰
庸人自扰 2020-12-10 19:17

I realize that the align.plots function from the ggExtra package has been deprecated and removed. However, I am using my own version as it seems to

相关标签:
3条回答
  • 2020-12-10 19:56

    To solve the problem using the align.plots method, specify respect=TRUE on the layout call:

    grid_layout <- grid.layout(nrow=2, ncol=2, widths=c(1,2), heights=c(2,1), respect=TRUE)
    
    0 讨论(0)
  • 2020-12-10 20:04

    ggplot2 now has ggplotGrob(), which may help with this.

    First, we need to update the code used to generate the plots:

    p1a = ggplot(df2, aes(x=x, y=y, colour=group)) + geom_point()  +
      scale_x_continuous(limits=range) + scale_y_continuous(limits=range)
    p1 = p1a + coord_equal(ratio=1) + theme_minimal() + theme(legend.position='none')
    p2 = ggplot(df, aes(x=x, y=group, colour=group)) + geom_point() +   
      scale_x_continuous(limits=range) + theme_minimal() + theme(legend.position='none')
    p3 = ggplot(df, aes(x=group, y=y, colour=group)) + geom_point() + 
      scale_y_continuous(limits=range) + theme_minimal() + theme(legend.position='none') 
    p4 <- ggplot(df, aes(x = group, y = y)) + 
      geom_blank() +
      theme(line = element_blank(),
            rect = element_blank(),
            text = element_blank(),
            title = element_blank())
    

    p4 will be blank; we just need the grob to draw.

    Then we load the grid package and draw the grobs in a list arranged in rows and columns using cbind() and rbind().

    library(grid)
    grid.newpage()
    grid.draw(
      cbind(
        rbind(ggplotGrob(p3), ggplotGrob(p4), size = "first"),
        rbind(ggplotGrob(p1), ggplotGrob(p2), size = "first"), 
        size = "first"))
    

    Grid plot

    I'm not sure if this method will let you plot p3 in a different width and p2 in a different height, as you have them in the original example; I normally need a grid of similarly-sized graphs, and haven't needed to figure out different sizes.

    This answer is partially based on partially based on https://stackoverflow.com/a/17463184/393354

    0 讨论(0)
  • 2020-12-10 20:05

    Here is an example:

    m <- matrix(c(3, 1, 0, 2), 2, byrow = T)
    lay <- gglayout(m, widths = c(1, 3), heights = c(3, 1))
    ggtable(p1, p2, p3, layout = lay)
    

    you can use this by

    install.packages('devtools')
    library(devtools)
    dev_mode()
    install_github("ggplot2", "kohske", "cutting-edge")
    library(ggplot2)
    

    note that this branch is experimental, so maybe there are bugs.

    enter image description here

    0 讨论(0)
提交回复
热议问题