【问题标题】:Overlay grid on coloured panel background and different coloured rectangle彩色面板背景和不同颜色矩形上的叠加网格
【发布时间】:2020-08-18 01:06:39
【问题描述】:

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

如果我不对面板背景着色,感谢 AF7 和 zx8754 here,我有一个很好的解决方案。但是如果我也尝试为面板背景着色,它就不起作用了。

这是一个代表:

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")

【问题讨论】:

  • 谢谢 Z.Lin。很好的解决方案。

标签: r ggplot2 grid overlay


【解决方案1】:

在 ggplot 中,面板背景和网格层包含在同一个 grob 中。所以要么都停留在几何层之下(默认panel.ontop = FALSE),要么都越过它们(panel.ontop = TRUE)。以下是两种可能的解决方法供您考虑:

  1. 使用panel.ontop = TRUE,保持面板背景透明,并用您想要的颜色为整个绘图背景着色:
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)) 

  1. 保留默认 panel.ontop = FALSE,然后修改底层 grobs 以将网格线移动到顶部:
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)

第一种方法实现起来更简单,但面板背景颜色会“溢出”到整个绘图,包括轴标签。根据您的用例,您可能会发现其中一种或另一种更有用。

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2013-08-13
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多