R语言时间序列图高亮指定区域及对齐堆叠问题求助
修正R语言时间序列高亮堆叠图的问题
问题根源
- 原代码通过
subset筛选满足条件的行后逐行绘制矩形,导致连续满足条件的区间被分割成多个小矩形,且最后一行因lead(DateTime)生成NA值,造成高亮缺失 - 第二个图的条件未明确边界逻辑,若需求包含335和390,原代码的
>和<会遗漏边界点 grid.arrange对X轴的对齐效果不够精准,易出现上下图时间轴错位
修正方案
- 预处理数据,将连续满足条件的时间段合并为完整区间,避免重复绘制小矩形
- 明确条件的边界逻辑,按需调整为
>=/<= - 使用
patchwork包替代gridExtra,实现更精准的X轴对齐
完整修正代码
# 加载所需包 library(ggplot2) library(dplyr) library(patchwork) # 生成时间序列数据 start_time <- as.POSIXct("2024-05-01 00:00:00") end_time <- as.POSIXct("2024-05-02 00:00:00") time_seq <- seq(from = start_time, to = end_time, by = "15 min") set.seed(123) # 设置随机种子保证结果可复现 variable1 <- rnorm(length(time_seq), mean = 25, sd = 5) variable2 <- rnorm(length(time_seq), mean = 350, sd = 20) df <- data.frame(DateTime = time_seq, Variable1 = variable1, Variable2 = variable2) # --- 处理Variable1的高亮区间 --- df_var1 <- df %>% mutate(highlight = Variable1 > 28.3, # 标记连续高亮的分组 group = cumsum(c(TRUE, diff(highlight) != 0))) %>% filter(highlight) %>% group_by(group) %>% summarise(xmin = min(DateTime), xmax = max(lead(DateTime, default = last(DateTime)))) %>% ungroup() # --- 处理Variable2的高亮区间 --- df_var2 <- df %>% mutate(highlight = Variable2 >= 335 & Variable2 <= 390, # 包含边界值 group = cumsum(c(TRUE, diff(highlight) != 0))) %>% filter(highlight) %>% group_by(group) %>% summarise(xmin = min(DateTime), xmax = max(lead(DateTime, default = last(DateTime)))) %>% ungroup() # 绘制第一个图 plot_var1 <- ggplot(df, aes(x = DateTime, y = Variable1)) + geom_rect(data = df_var1, aes(xmin = xmin, xmax = xmax), ymin = -Inf, ymax = Inf, fill = "lightblue", alpha = 0.3) + geom_line(color = "blue") + labs(x = "时间", y = "变量1") + theme_minimal() # 绘制第二个图 plot_var2 <- ggplot(df, aes(x = DateTime, y = Variable2)) + geom_rect(data = df_var2, aes(xmin = xmin, xmax = xmax), ymin = -Inf, ymax = Inf, fill = "lightpink", alpha = 0.3) + geom_line(color = "red") + labs(x = "时间", y = "变量2") + theme_minimal() # 堆叠图并对齐X轴 plot_var1 / plot_var2
关键说明
- 用
cumsum(diff(highlight) !=0)标记连续满足条件的区间分组,合并成完整的矩形范围,避免重复绘制 lead(DateTime, default = last(DateTime))处理最后一行的NA问题,保证高亮到最后一个时间点patchwork的/运算符自动对齐上下图的X轴,无需额外设置- 若不需要包含边界值,可将Variable2的条件改回
Variable2 > 335 & Variable2 < 390
内容的提问来源于stack exchange,提问作者LZ24AP
相关产品推荐
相关产品推荐

