Centered X-axis label for muliplot using cowplot package

Jason picture Jason · Oct 14, 2015 · Viewed 10.1k times · Source

I have a multiplot figure consisting of 4 plots in a 2x2 configuration. I arranged the plots using the "cowplot" package and the plot_grid function using the code below

plot_grid(p1, p2, p3, p4, align='vh', vjust=1, scale = 1)

where p1-p4 are my 4 plots. The resulting figure has an x-axis label associated with each column in the multiplot:

enter image description here

Does anyone know how I can code a single x-axis label centered at the bottom of the multiplot, either with cowplot or another way?

Answer

J.Con picture J.Con · May 23, 2018

Another option is to use textGrob to add annotations for common x and y labels.

In this example, if you wish to remove the individual axis labels, just include theme(axis.title = element_blank()) in the plot calls. (or, for just y-axis, use theme(axis.title.y=element_blank())).

library(ggplot2)
library(cowplot)
library(grid)
library(gridExtra)

ToothGrowth$dose <- as.factor(ToothGrowth$dose)

#make 4 plots

p1<-ggplot(ToothGrowth, aes(x=dose, y=len)) + 
  geom_boxplot()


p2<-ggplot(ToothGrowth, aes(x=dose, y=supp)) + 
  geom_boxplot()

p3<-ggplot(ToothGrowth, aes(x=supp, y=len)) + 
  geom_boxplot()

p4<-ggplot(ToothGrowth, aes(x=supp, y=dose)) + 
  geom_boxplot()

#combine using cowplot

plot<-plot_grid(p1, p2, p3, p4, align='vh', vjust=1, scale = 1)

#create common x and y labels

y.grob <- textGrob("Common Y", 
                   gp=gpar(fontface="bold", col="blue", fontsize=15), rot=90)

x.grob <- textGrob("Common X", 
                   gp=gpar(fontface="bold", col="blue", fontsize=15))

#add to plot

grid.arrange(arrangeGrob(plot, left = y.grob, bottom = x.grob))

enter image description here