You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:50:39