R中如何绘制按年分组且x轴无年份的小时级时间序列折线图
多年份小时级时间序列重叠折线图实现方案
核心实现逻辑
- 把所有时间戳的年份统一替换为同一个虚拟年份(推荐选闰年,比如2020,兼容2月29日的日期数据),保留原有月、日、小时等全部时间精度,让不同年份的相同时刻对齐到x轴的同一位置
- 绘图时x轴映射这个统一年份的时间列,分组、颜色映射使用原始时间的真实年份
- 调整x轴刻度显示格式,隐藏虚拟年份,仅展示月、日、小时信息
该方案不需要将时间转为无年份字符串(会导致转POSIXct时缺少年份信息返回NA),也不需要使用年积日(yday),完全保留小时级的周期变化细节。
完整可运行代码
require(data.table) require(lubridate) require(ggplot2) # 样例数据生成 dt <- data.table(date = c(seq(as.Date("2018-03-01"), as.Date("2018-03-07"),by="day"), seq(as.Date("2019-03-01"), as.Date("2019-03-07"),by="day"), seq(as.Date("2020-03-01"), as.Date("2020-03-07"),by="day")), hr = rep(1:24, 21)) dt[, value := sin(hr)*sample(1:3,1)] dt[, dateTime := as.POSIXct(paste0(date," ",hr,":00:00"), format="%Y-%m-%d %H:%M")] # 新增统一虚拟年份的时间列 dt[, common_datetime := update(dateTime, year = 2020)] # 绘图 ggplot(dt, aes(x = common_datetime, y = value, group = year(dateTime), colour = factor(year(dateTime)))) + geom_line() + # 调整x轴标签,仅显示月-日 小时:分钟 scale_x_datetime(date_labels = "%m-%d %H:%M", name = "日期时间") + labs(colour = "年份")
效果说明
运行代码后x轴会展示3月1日到3月7日的逐小时时间刻度,2018、2019、2020三个年份各为独立的折线,完全符合需求。如果你的数据包含2月29日的记录,只需要把update函数里的year参数修改为任意闰年即可。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

