R 在彩色面板背景和不同颜色的矩形上覆盖网格

R 在彩色面板背景和不同颜色的矩形上覆盖网格,r,ggplot2,grid,overlay,R,Ggplot2,Grid,Overlay,我正在用R中的ggplot2绘制图表。我想用一种颜色给面板背景上色,用另一种颜色给面板内的矩形上色。我希望网格线覆盖面板和矩形 如果我不给面板背景上色,多亏了AF7和zx8754,我有了一个很好的解决方案。但是如果我也尝试给面板背景上色,它就不起作用了 这是一个reprex: library(ggplot2) t <- c(1,2,3) a <- c(5,4,1) b <- c(3,2,4) df <- data.frame(t,a,b) ggplot(df) +

我正在用R中的ggplot2绘制图表。我想用一种颜色给面板背景上色,用另一种颜色给面板内的矩形上色。我希望网格线覆盖面板和矩形

如果我不给面板背景上色,多亏了AF7和zx8754,我有了一个很好的解决方案。但是如果我也尝试给面板背景上色,它就不起作用了

这是一个reprex:

library(ggplot2)
t <- c(1,2,3)
a <- c(5,4,1)
b <- c(3,2,4)
df <- data.frame(t,a,b)

ggplot(df) +
  geom_rect(xmin=2,xmax=3,ymin=-Inf,ymax=Inf,fill="gray") +

  # The code works fine without this next line, but the panel colour is the default (white)
  # I want the background colour to be lightblue except for the rectangle
  theme(panel.background = element_rect(fill = "lightblue")) +

  # Changing NA to "lightblue" in the line below does not work either
  theme(panel.background = element_rect(fill = NA),panel.ontop = TRUE) +

  theme(panel.grid.minor=element_line(colour="hotpink",size=0.5)) +
  theme(panel.grid.major=element_line(colour="green",size=0.5)) +
  geom_line(aes(x=t,y=a),colour="red") +
  geom_line(aes(x=t,y=b),colour="blue")
库(ggplot2)

t在ggplot中,面板背景和网格层包含在同一个grob中。因此,要么两者都位于geom层下方(默认值
panel.ontop=FALSE
),要么都位于geom层上方(
panel.ontop=TRUE
)。这里有两种可能的解决方法供考虑:

  • 使用
    panel.ontop=TRUE
    ,保持面板背景透明,并使用所需颜色为整个绘图背景上色:
  • 保留默认值
    panel.ontop=FALSE
    ,然后将底层网格线移动到顶部:

  • p谢谢林子江。伟大的解决方案。
    
    ggplot(df) +
      geom_rect(xmin=2,xmax=3,ymin=-Inf,ymax=Inf,fill="gray") +
      geom_line(aes(x=t,y=a),colour="red") +
      geom_line(aes(x=t,y=b),colour="blue")+
    
      theme(plot.background = element_rect(fill = "lightblue"), # change this line to plot.background
            panel.background = element_rect(fill = NA),
            panel.ontop = TRUE,
            panel.grid.minor=element_line(colour="hotpink",size=0.5),
            panel.grid.major=element_line(colour="green",size=0.5)) 
    
    p <- ggplot(df) +
      geom_rect(xmin=2,xmax=3,ymin=-Inf,ymax=Inf,fill="gray") +
      geom_line(aes(x=t,y=a),colour="red") +
      geom_line(aes(x=t,y=b),colour="blue")+
    
      theme(panel.background = element_rect(fill = "lightblue"),
            panel.grid.minor=element_line(colour="hotpink",size=0.5),
            panel.grid.major=element_line(colour="green",size=0.5)) 
    
    # convert from ggplot object to grob object
    gp <- ggplotGrob(p) 
    
    # make a copy of the grob that contains the panel background (first child) & panel grids (all subsequent children),
    # then drop the panel background grob (i.e. only keep the grobs for grids)
    panel.grid.grob <- gp$grobs[[6]]$children[[1]]
    panel.grid.grob$children[[1]] <- zeroGrob()
    
    # leave only the panel background grob in its original slot
    gp$grobs[[6]]$children[[1]] <- gp$grobs[[6]]$children[[1]]$children[[1]]
    
    # add back grid grobs on top of panel
    gp <- gtable::gtable_add_grob(gp, panel.grid.grob, t = 7, l = 5)
    
    # plot result
    grid::grid.draw(gp)