基于可变哑变量自动为ggplot图表区域填充背景色的实现方案
方案1:自动识别区间搭配geom_rect(视觉效果最优)
用rle()函数自动识别所有符合条件的连续区间,无需手动指定起止值,完全适配动态更新的数据集:
library(ggplot2) # 原数据生成逻辑,可任意调整参数 set.seed(3) plotdata <- data.frame(somevalue = rnorm(10), indicator = 0 , counter = 1:10) plotdata[plotdata$somevalue < 0,]$indicator <- 1 # 自动生成着色区间,全程无需手动修改 rle_info <- rle(plotdata$indicator == 1) end <- cumsum(rle_info$lengths) start <- dplyr::lag(end, default = 0) + 1 plotranges <- data.frame( from = start[rle_info$values], to = end[rle_info$values] ) # 绘图 ggplot() + geom_rect(data = plotranges, aes(xmin = from - 0.5, xmax = to + 0.5, ymin = -Inf, ymax = Inf), alpha = 0.4, fill = "grey50") + geom_line(data = plotdata, aes(x = counter, y = somevalue))
这里xmin和xmax各偏移0.5,是为了让着色区域完整覆盖对应counter的整个宽度,不会出现半边留白的问题。
方案2:用geom_col实现无需额外生成区间的版本
如果不想额外处理区间数据,可以直接用geom_col实现需求,调整你之前写法的问题即可:
ggplot(data = plotdata, aes(x = counter, y = somevalue)) + # 先画背景着色条,y设为Inf自动撑满整个y轴范围 geom_col(aes(y = Inf, fill = factor(indicator)), alpha = 0.4, position = "identity") + geom_line() + # 隐藏indicator图例,非符合条件的区域设为透明 scale_fill_manual(values = c("0" = "transparent", "1" = "grey50"), guide = "none")
如果你的counter是连续数值,且介意相邻同条件区域的geom_col之间有细微竖线缝隙,优先选方案1即可。
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

