Home > database >  Center tags of nested plot using ggplot and patchwork
Center tags of nested plot using ggplot and patchwork

Time:10-26

How can I properly center the tags of a nested plot in the following example? I want to center the tag/title of the second panel just like the first.

Alternatively, using multiple titles/subtitles would also be fine instead of tags (I've tried using titles but the title of the lower graph disappears when combining the plots). Setting element_text(hjust = 0.5) also doesn't seem to have any effect here.

library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars)   
  geom_point(aes(mpg, disp))   
  ggtitle('Plot 1')

p2 <- ggplot(mtcars)   
  geom_boxplot(aes(gear, disp, group = gear))   
  ggtitle('Plot 2')

p3 <- ggplot(mtcars)   
  geom_point(aes(hp, wt, colour = mpg))   
  ggtitle('Plot 3')

p4 <- ggplot(mtcars)   
  geom_bar(aes(gear))   
  facet_wrap(~cyl)   
  ggtitle('Plot 4')

ptop <- p1
pbot <- p1   p2   p3   p4
combined <- ptop   pbot  
  plot_layout(ncol = 1, guides = "collect")  
  plot_annotation(tag_levels = list(c("(a) Panel a", "(b) Panel b "))) &
  theme(plot.tag = element_text(hjust = 0.5, size = 30),
        plot.tag.position = "top",
        legend.position = "bottom") 
combined

enter image description here

CodePudding user response:

I was able to get it working with cowplot as an addition

library(ggplot2)
library(patchwork)
library(cowplot)

p1 <- ggplot(mtcars)   
  geom_point(aes(mpg, disp))   
  ggtitle(label = "",
          subtitle = 'Plot 1') 

p2 <- ggplot(mtcars)   
  geom_point(aes(mpg, disp))   
  ggtitle(label = "",
          subtitle = 'Plot 1')

p3 <- ggplot(mtcars)   
  geom_boxplot(aes(gear, disp, group = gear))   
  ggtitle(label = "",
          subtitle = 'Plot 2')

p4 <- ggplot(mtcars)   
  geom_point(aes(hp, wt, colour = mpg))   
  ggtitle(label = "",
          subtitle = 'Plot 3')  
  theme(legend.position = "none")

p5 <- ggplot(mtcars)   
  geom_bar(aes(gear))   
  facet_wrap(~cyl)   
  ggtitle(label = "",
          subtitle = 'Plot 4')

ptop <- p1    plot_annotation("(a) Panel a")& theme(plot.title = element_text(hjust = 0.5))
pbot <- p2   p3   p4   p5    plot_annotation("(b) Panel b") & theme(plot.title = element_text(hjust = 0.5))
legend_b <- get_legend(
  p4 
  theme(legend.position = "bottom",
        legend.direction = "horizontal")
)

plot_grid(ptop, pbot, legend_b, ncol = 1, nrow = 3, rel_heights = c(1, 1,0.25))

plot

  • Related