Search code examples
rggplot2facet

How to avoid axis line disappearing when using ggarrange?


I'd like to arrange two facet plots using ggarrange (in order to get x axes aligned).

library(egg)
library(ggplot2)

p1 <- ggplot(warpbreaks) +
  geom_bar(aes(x = wool)) +
  facet_wrap(~tension, ncol = 2, scales = "free_x") +
  theme_bw() +
  theme(axis.line = element_line(colour = "black", size = .1),
        panel.border = element_blank(),
        strip.background = element_blank())

p2 <- ggplot(warpbreaks) +
  geom_bar(aes(x = tension)) +
  facet_wrap(~wool) +
  theme_bw() +
  theme(axis.line = element_line(colour = "black", size = .1),
        panel.border = element_blank(),
        strip.background = element_blank())

ggarrange(p1, p2, ncol = 2)

enter image description here

Works great, but unfortunately the vertical axis lines disappeared. This does not happen when using grid.arrange, but at least for my real data there the x axes are not aligned, hence my wish to use ggarrange. Is there a way to keep the axis lines?


Solution

  • tl;dr: setting panel.background = element_blank() should restore the axes.

    I think it's a combination of a clipping issue in ggplot2 (the y axis line can be clipped by the plot panel, cutting its width in half), and egg::gtable_frame placing the axis below the plot panel.

    library(egg)
    library(ggplot2)
    
    p1 <- ggplot(warpbreaks) +
      geom_bar(aes(x = wool)) +
      facet_wrap(~tension, ncol = 2, scales = "free_x") +
      theme_bw() +
      theme(axis.line = element_line(colour = alpha("red", 0.5), size = 5),
            panel.border = element_blank(),
            panel.background = element_rect(fill = alpha("white", 0.5), 
                                            linetype = 2, colour = "black"),
            strip.background = element_blank())
    
    p1
    

    enter image description here

    g1 <- ggplotGrob(p1)
    gg <- gtable_frame(g1)
    grid.newpage()
    grid.draw(gg)
    

    enter image description here