R语言如何筛选18:00至次日7:00时间区间并绘制数据图
解决时间筛选错误与ggplot不必要连线问题
一、修复时间筛选逻辑
你当前的筛选错误是误用了&逻辑符——"18:00:00"到"23:59:59"和"00:00:00"到"07:00:00"是两个不重叠的区间,应该用|(逻辑或)。另外,用字符串处理时间容易出现边界误差,推荐用lubridate包直接提取小时判断,更可靠:
步骤1:加载包并统一时间格式
library(dplyr) library(lubridate) library(ggplot2) # 确保date列是标准时间格式(如果还不是的话) Marzo$date <- as.POSIXct(Marzo$date)
步骤2:正确筛选目标时段
data1 <- Marzo %>% filter( # 保留18:00及之后,或者7:00之前的所有数据 hour(date) >= 18 | hour(date) < 7 # 若需要精确包含7:00整的数据,可改为:hour(date)>=18 | (hour(date)==7 & minute(date)==0) )
这样就能同时保留每日18:00-23:59和次日0:00-7:00的数据。
二、消除ggplot的不必要连线
筛选后的数据存在时间断层(比如前一天23:55直接跳到次日18:00),ggplot默认会把这些非连续点强行连线。解决方法是给每个连续的夜间时段创建分组ID,让geom_line仅在同一组内连线:
步骤1:添加分组ID列
在筛选前给数据添加分组ID,把当日18:00到次日7:00的所有数据归为同一组:
Marzo <- Marzo %>% mutate( # 18:00及之后的时间,组ID为当天日期;0:00-7:00的时间,组ID为前一天日期 group_id = ifelse(hour(date) >= 18, as.Date(date), as.Date(date) - days(1)) )
步骤2:修改ggplot代码,指定分组
在geom_line的aes中加入group=group_id,确保仅同一组内的点连线:
ggplot() + geom_line(data= data1, aes(x= date, y= RH3000, colour= "RH3000", group=group_id), lwd=1) + geom_line(data= data1, aes(x= date, y= RH4000, colour= "RH4000", group=group_id), lwd=1) + scale_colour_manual("", breaks=c("RH3000","RH4000"), values=c("blue4","turquoise1")) + scale_x_datetime(labels= date_format("%m-%d %H:%M"), date_breaks= "12 hours")
完整代码示例
library(dplyr) library(lubridate) library(ggplot2) # 统一时间格式 Marzo$date <- as.POSIXct(Marzo$date) # 添加夜间时段分组ID Marzo <- Marzo %>% mutate( group_id = ifelse(hour(date) >= 18, as.Date(date), as.Date(date) - days(1)) ) # 筛选目标时段 data1 <- Marzo %>% filter(hour(date) >= 18 | hour(date) < 7) # 绘制无多余连线的时序图 ggplot() + geom_line(data= data1, aes(x= date, y= RH3000, colour= "RH3000", group=group_id), lwd=1) + geom_line(data= data1, aes(x= date, y= RH4000, colour= "RH4000", group=group_id), lwd=1) + scale_colour_manual("", breaks=c("RH3000","RH4000"), values=c("blue4","turquoise1")) + scale_x_datetime(labels= date_format("%m-%d %H:%M"), date_breaks= "12 hours")
内容的提问来源于stack exchange,提问作者Gabriel Bernabé García
相关产品推荐
相关产品推荐

