在R(ggplot2)中按年份绘制每日时间序列
在R中按年份拆分每日时间序列并绘制多条曲线
和Python中「按年份拆分时间序列用于绘图」的需求类似,以下是两种在R中实现每日时间序列按年份拆分、以多条曲线展示的方法:
示例数据与基础绘图
先准备一份模拟的每日时间序列数据,先画基础的时序图看看效果:
library(ggplot2) library(dplyr) # 生成模拟每日数据 df <- data.frame( day = as.Date("2017-06-14") - 0:364, value = runif(365) + seq(-140, 224)^2 / 10000 ) # 基础时序图(所有年份数据混在一起) p <- ggplot(df, aes(x=day, y=value)) + geom_line() + xlab("") p
方法一:用ggplot2手动处理日期(修正日期标签异常)
核心思路是把不同年份的日期对齐到同一年的时间轴上,用年份作为颜色区分曲线,修正原代码中列名错误导致的标签显示问题:
library(tidyverse) library(lubridate) p <- df %>% mutate( year = factor(year(day)), # 提取年份作为分组变量 aligned_day = update(day, year = 1) # 将所有日期的年份统一设为1,实现时间轴对齐 ) %>% ggplot(aes(x=aligned_day, y=value, color = year)) + geom_line() + scale_x_date(date_breaks = "1 month", date_labels = "%b") + # 按月份显示标签 xlab("日期") + ylab("数值") p
这样处理后,不同年份的曲线会在同一时间轴(按月份对齐)上展示,颜色区分年份,日期标签也能正常显示。
方法二:用feasts包的gg_season快速实现
如果是结构化的时序数据,用feasts包的gg_season函数可以更高效地完成这个需求,无需手动处理日期:
library(feasts) library(tsibble) library(dplyr) # 使用内置的澳大利亚零售数据作为示例 tsibbledata::aus_retail %>% filter( State == "Victoria", Industry == "Cafes, restaurants and catering services" ) %>% gg_season(Turnover) + # 直接按年份拆分绘制曲线 labs(x = "日期", y = "营业额")
gg_season会自动识别时序数据的时间结构,按年份拆分并对齐时间轴,适合处理专业的时序分析场景。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

