按开关状态双颜色可视化功率随时间变化的绘图需求
基于R的可视化方案
以下是用ggplot2实现需求的完整代码,分为数据预处理和绘图两部分:
1. 数据预处理
首先需要把原始的ymdhms字段转换为标准时间格式,再计算从初始时间开始流逝的秒数;同时为了绘制连续的状态背景色块,需要生成每个开关状态对应的时间区间:
library(ggplot2) library(dplyr) library(lubridate) # 加载数据 data <- data.frame(ymdhms=c(20230301000000,20230301000010,20230301000020,20230301000030,20230301000040, 20230301000050,20230301000100,20230301000110), switch=c(0,0,0,1,0,0,1,0), power=c(20,21,22,23,20,19,29,28)) # 转换时间格式并计算流逝秒数 data <- data %>% mutate(datetime = ymd_hms(as.character(ymdhms)), elapsed_sec = as.numeric(difftime(datetime, first(datetime), units = "secs"))) # 生成状态区间数据(用于绘制背景色块) state_intervals <- data %>% mutate(group = cumsum(switch != lag(switch, default = first(switch)))) %>% group_by(group, switch) %>% summarise(start_sec = min(elapsed_sec), end_sec = max(elapsed_sec) + 10, # 加上数据间隔,让色块覆盖到下一个时间点 .groups = "drop") %>% mutate(fill_color = ifelse(switch == 1, "#7ccd7c", "#ff6b6b")) # 绿色=开关开启,红色=开关关闭
2. 绘制可视化图表
先绘制背景的状态色块,再叠加功率的折线和数据点,确保横轴显示流逝秒数,纵轴为功率值:
ggplot() + # 绘制状态背景色块 geom_rect(data = state_intervals, aes(xmin = start_sec, xmax = end_sec, ymin = -Inf, ymax = Inf, fill = fill_color), alpha = 0.2) + # 绘制功率折线和数据点 geom_line(data = data, aes(x = elapsed_sec, y = power), color = "black", linewidth = 1) + geom_point(data = data, aes(x = elapsed_sec, y = power), size = 3, color = "darkblue") + # 设置坐标轴标签和主题 labs(x = "已流逝秒数", y = "功率(power)", title = "功率随时间变化及开关状态") + scale_fill_identity() + theme_minimal() + theme(plot.title = element_text(hjust = 0.5))
代码说明
- 数据预处理部分:用
ymd_hms把字符型时间串转为标准时间格式,通过difftime计算流逝秒数;通过分组识别连续的开关状态,生成每个状态对应的时间区间,保证背景色块是连续的。 - 绘图部分:
geom_rect绘制覆盖整个纵轴的背景色块,设置透明度避免遮挡折线;geom_line和geom_point分别呈现功率的变化趋势和具体数据点;scale_fill_identity直接使用我们定义的颜色值。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

