ggplot2 - Correctly arrange odd number of plots into one figure

后端 未结 4 1642
攒了一身酷
攒了一身酷 2020-12-19 11:42

I have an odd number of plots to arrange into one figure and I desire to show the last plot centered in the last row of the figure.

Here some sample data:

         


        
相关标签:
4条回答
  • 2020-12-19 11:54

    This uses grid and gridExtra to place the plots on a 2×4 matrix layout. Each of your plots occupies two "slots". The two outer "slots" on the bottom row are plotted as NULL grobs to centre your plot.

    # Convert to grobs
    lst_p <- lapply(lst_p, ggplotGrob)
    
    # Plot using gridExtra and grid
    gridExtra::grid.arrange(lst_p[[1]], lst_p[[2]], grid::nullGrob(), lst_p[[3]], grid::nullGrob(),
                            layout_matrix = matrix(c(1,1,2,2,3,4,4,5), byrow = TRUE, ncol = 4))
    

    0 讨论(0)
  • 2020-12-19 11:55

    Using nested cowplot::plot_grids:

    library(ggplot2)
    set.seed(99)
    
    x_1 = data.frame(z = rnorm(100))
    x_2 = data.frame(z = rnorm(100))
    x_3 = data.frame(z = rnorm(100))
    
    lst = list(x_1, x_2, x_3)
    
    lst_p = list()
    
    for (i in 1:length(lst)) {
        lst_p[[i]] = ggplot(data=lst[[i]], aes(lst[[i]]$z)) + 
        geom_histogram() +
            xlab("X LAB") +
            ylab("Y LAB") 
    }
    
    
    p_no_labels = lapply(lst_p, function(x) x + xlab("") + ylab(""))
    
    title = cowplot::ggdraw() + cowplot::draw_label("test", size = 20)
    top_row = cowplot::plot_grid(p_no_labels[[1]], p_no_labels[[2]], ncol=2)
    bottom_row = cowplot::plot_grid(NULL, p_no_labels[[2]], NULL, ncol=3, rel_widths=c(0.25,0.5,0.25))
    
    cowplot::plot_grid(title, top_row, bottom_row, ncol=1, rel_heights=c(0.1,1,1))
    

    0 讨论(0)
  • 2020-12-19 11:55

    A not-terribly elegant solution would be to leave the middle plot empty on the first row:

    p_no_labels2<-list(p_no_labels[[1]],NULL,p_no_labels[[2]],NULL,p_no_labels[[3]])
    p_grid = cowplot::plot_grid(plotlist = p_no_labels2, ncol = 3) 
    

    0 讨论(0)
  • 2020-12-19 12:13

    You can use gridExtra::grid.arrange for this. All you need to do is specify the layout of the plots with a layout matrix.

    library(ggplot2)
    set.seed(99)
    
    x_1 = data.frame(z = rnorm(100))
    x_2 = data.frame(z = rnorm(100))
    x_3 = data.frame(z = rnorm(100))
    
    lst = list(x_1, x_2, x_3)
    
    lst_p = list()
    
    for (i in 1:length(lst)) {
    lst_p[[i]] = ggplot(data=lst[[i]], aes(lst[[i]]$z)) + 
    geom_histogram() +
    xlab("X LAB") +
    ylab("Y LAB") 
    }
    
    p_no_labels = lapply(lst_p, function(x) x + xlab("") + ylab(""))
    
    
    #layout of plots
    
    lay <- rbind(c(1,2),c(1,2),
                  c(3,3))
    
    
    
    #arrange the grid and specify the `layout_matrix`
    gridExtra::grid.arrange(grobs=p_no_labels, layout_matrix=lay)
    

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