如何解决在彩色面板背景和其他彩色矩形上覆盖网格
我正在R中使用ggplot2绘制图表。我想使用一种颜色为面板背景上色,并在面板中使用另一种颜色来绘制矩形。我希望网格线覆盖面板和矩形。
如果我不给面板背景着色,那么感谢AF7和zx8754 here,这是一个很好的解决方案。但是,如果我也尝试给面板背景着色,那是行不通的。
这是一个代表:
library(ggplot2)
t <- c(1,2,3)
a <- c(5,4,1)
b <- c(3,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")
解决方法
在ggplot中,面板背景和网格层包含在同一grob中。因此,要么都停留在geom层之下(默认为panel.ontop = FALSE
),要么都停留在它们之上(panel.ontop = TRUE
)。这里有两个可能的解决方法可供考虑:
- 使用
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))
- 保留默认的
panel.ontop = FALSE
,然后修改底层的grob将网格线移到顶部:
p <- ggplot(df) +
geom_rect(xmin=2,colour="blue")+
theme(panel.background = element_rect(fill = "lightblue"),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)
第一种方法更易于实现,但是面板背景颜色会在整个图形(包括轴标签)上“溢出”。您可能会发现其中一种更为有用,具体取决于您的用例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。