R语言15分钟时间序列按2小时间隔绘图求助
解决ggplot中15分钟时间序列按2小时分组显示x轴的问题
核心思路
先对时间序列按2小时间隔分组生成区间标签,再通过scale_x_datetime自定义x轴刻度,或用分面的方式展示分组数据。以下是具体实现步骤:
1. 准备环境与示例数据
先加载所需工具包,并构造符合需求的示例数据(可替换为你的真实数据):
library(tidyverse) library(lubridate) # 生成96个15分钟间隔的时间点(覆盖全天) times <- seq(ymd_hms("2024-01-01 00:00:00"), by = "15 mins", length.out = 96) # 生成随机价格数据(替换为你的真实价格列) set.seed(123) prices <- rnorm(96, mean = 50, sd = 5) # 组合成数据框 df <- tibble(datetime = times, price = prices)
2. 生成2小时区间分组标签
通过floor_date将时间对齐到2小时起点,再拼接成区间字符串:
df <- df %>% mutate( # 取每个时间点所属2小时区间的起始时间 two_hour_start = floor_date(datetime, "2 hours"), # 生成"00:00-02:00"格式的区间标签 two_hour_interval = paste0(format(two_hour_start, "%H:%M"), "-", format(two_hour_start + hours(2), "%H:%M")) )
3. 绘图实现(两种方式可选)
方式一:单图展示+2小时刻度分隔
保留原始时间序列的连续性,x轴按2小时区间标注,添加虚线分隔不同区间:
ggplot(df, aes(x = datetime, y = price)) + geom_line(color = "#2c3e50") + geom_point(size = 1.5, color = "#e74c3c") + # 自定义x轴:每2小时一个刻度,标签显示区间 scale_x_datetime( breaks = seq(min(df$datetime), max(df$datetime), by = "2 hours"), labels = function(x) paste0(format(x, "%H:%M"), "-", format(x + hours(2), "%H:%M")), # 旋转标签避免重叠 guide = guide_axis(angle = 45) ) + # 添加2小时间隔的虚线,区分分组 geom_vline(xintercept = seq(min(df$datetime), max(df$datetime) + hours(2), by = "2 hours"), color = "#bdc3c7", linetype = "dashed") + labs( x = "时间区间(2小时)", y = "平均价格", title = "每日15分钟平均价格按2小时分组展示" ) + theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), axis.text.x = element_text(size = 10) )
方式二:分面展示每个2小时区间
把每个2小时区间单独做成子图,方便对比不同时段的价格变化:
ggplot(df, aes(x = format(datetime, "%H:%M"), y = price)) + geom_line(group = 1, color = "#2c3e50") + geom_point(size = 1.5, color = "#e74c3c") + # 按2小时区间分面,3列排列 facet_wrap(~two_hour_interval, ncol = 3) + labs( x = "15分钟时间点", y = "平均价格", title = "每日15分钟平均价格按2小时分组展示" ) + theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), strip.text = element_text(size = 10, face = "bold") )
内容的提问来源于stack exchange,提问作者Mar
相关产品推荐
相关产品推荐

