Search code examples
rggplot2cowplot

ggplot2 - Correctly arrange odd number of plots into one figure


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:

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)

p_grid = cowplot::plot_grid(plotlist = p_no_labels, ncol = 2)

print(cowplot::plot_grid(title, p_grid, 
                         ncol = 1, rel_heights = c(0.05, 1, 0.05)))

I want the 3rd plot at the centre of the figure. I am using cowplot.

Any suggestion? thanks

enter image description here


Solution

  • 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))