You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言时间序列图高亮指定区域及对齐堆叠问题求助

修正R语言时间序列高亮堆叠图的问题

问题根源

  1. 原代码通过subset筛选满足条件的行后逐行绘制矩形,导致连续满足条件的区间被分割成多个小矩形,且最后一行因lead(DateTime)生成NA值,造成高亮缺失
  2. 第二个图的条件未明确边界逻辑,若需求包含335和390,原代码的>和<会遗漏边界点
  3. grid.arrange对X轴的对齐效果不够精准,易出现上下图时间轴错位

修正方案

  1. 预处理数据,将连续满足条件的时间段合并为完整区间,避免重复绘制小矩形
  2. 明确条件的边界逻辑,按需调整为>=/<=
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:37:02