rggplot2cowplotgridlines

How to have a single grid background in "cowplot" using plot_grid() combining two plots together? in R language


In R language I want to have a single background horizontal lines (background grid) to make it easier to identify the columns. I will provide an example in the R code.

# install.packages("cowplot")
library(ggplot2) 
library(cowplot)



df <- data.frame(
  supp = rep(c("VC", "OJ"), each = 3),
  dose = rep(c("D0.5", "D1", "D2"), 2),
  len = c(6.8, 15, 33, 4.2, 10, 29.5)
)

p <- ggplot(df, aes(x = dose, y = len))+
  geom_col(aes(fill = supp), width = 0.7)+ coord_flip()+
  theme(axis.text.x=element_blank(),axis.ticks.x=element_blank(),
        axis.text.y=element_blank(),axis.ticks.y=element_blank()) +
  labs(x = "", y = "") +
  theme(  legend.position = "bottom",
          panel.background = element_rect(fill = "transparent"),
          panel.grid.major = element_blank(),
         panel.grid.minor = element_blank(),
         plot.background = element_rect(fill = "transparent", color = NA))
p

plot_grid(p, p, align = 'h', ncol = 2, rel_widths = c(5, 5)) 

The output of the two plot like that

I want to make a (background grid) in the form of grey horizontal lines that separates each column likee in the screenshot that will provided here I want the background pass by the two plots in the plot_grid with no separation. Because my original plots will be like that but more advance providing the columns names in the first plot only and these lines helps to know what column is that in the second column by looking at the first plot names. Thanks


Solution

  • One option would be to remove the space between your plots by setting the right/left plot.margin to zero, setting the axis.ticks.length to zero and by setting the y axis title to NULL. Finally I use geom_hline to add the "grid" lines.

    Note: I switched the role of x and y to get rid of coord_flip. Makes it easier (for my brain (;) to do the adjustments.

    # install.packages("cowplot")
    library(ggplot2)
    library(cowplot)
    
    df <- data.frame(
      supp = rep(c("VC", "OJ"), each = 3),
      dose = rep(c("D0.5", "D1", "D2"), 2),
      len = c(6.8, 15, 33, 4.2, 10, 29.5)
    )
    
    p <- ggplot(df, aes(y = dose, x = len)) +
      geom_col(aes(fill = supp), width = 0.7) +
      geom_hline(yintercept = 0:3 + .5) +
      labs(x = "", y = NULL) +
      theme(
        axis.text = element_blank(), 
        axis.ticks = element_blank(),
        axis.ticks.length = unit(0, "pt"),
        legend.position = "bottom",
        panel.background = element_rect(fill = "transparent"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.background = element_rect(fill = "transparent", color = NA)
      )
    
    plot_grid(
      p + theme(plot.margin = margin(5.5, 0, 5.5, 5.5)),
      p + theme(plot.margin = margin(5.5, 5.5, 5.5, 0)),
      align = "h", ncol = 2, rel_widths = c(5, 5)
    )