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

R语言周度时间序列绘图:如何设置X轴为月份/周数格式?

解决周度时间序列绘图X轴格式问题

方法1:基础R绘图自定义X轴

  • 提取时间序列的时间点并转换为可读格式
    先把时间序列的数值时间转换为具体日期,再格式化为「月份缩写 周数」的形式:
    # 先安装并加载lubridate包(若未安装)
    # install.packages("lubridate")
    library(lubridate)
    
    # 获取时间序列的数值时间
    ts_time <- time(TS1)
    # 拆分年份和周数
    year_val <- floor(ts_time)
    week_val <- round((ts_time - year_val) * 52 + 1)
    # 转换为每周起始日期(以周一为例)
    ts_dates <- ymd(paste(year_val, "01", "01", sep = "-")) + weeks(week_val - 1)
    # 生成「月份缩写 周数」格式的标签,比如"Feb W2"
    x_labels <- format(ts_dates, "%b W%V")
    
  • 绘制预测图并替换X轴
    假设已用forecast包生成预测结果fit_forecast,绘图时隐藏默认X轴,添加自定义标签:
    library(forecast)
    # 绘图时不显示默认X轴
    plot(fit_forecast, xaxt = "n")
    # 添加自定义X轴,las=2让标签垂直避免重叠
    axis(1, at = time(TS1), labels = x_labels, las = 2)
    

方法2:用ggplot2实现更灵活的格式控制

如果用ggplot2绘图,步骤更直观:

  • 转换时间序列和预测结果为数据框
    library(ggplot2)
    library(forecast)
    
    # 原始时间序列转数据框
    ts_df <- data.frame(
      date = ts_dates, # 复用上面生成的ts_dates
      value = as.vector(TS1)
    )
    # 预测结果转数据框并生成对应日期
    forecast_df <- as.data.frame(fit_forecast)
    forecast_df$date <- seq(max(ts_dates) + weeks(1), by = "week", length.out = nrow(forecast_df))
    
  • 绘图并设置X轴格式
    ggplot() +
      geom_line(data = ts_df, aes(x = date, y = value), color = "black") +
      geom_line(data = forecast_df, aes(x = date, y = Point.Forecast), color = "blue") +
      geom_ribbon(data = forecast_df, aes(x = date, ymin = Lo.80, ymax = Hi.80), fill = "blue", alpha = 0.2) +
      scale_x_date(date_labels = "%b W%V", date_breaks = "4 weeks") + # 每4周显示一个标签
      theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 标签倾斜避免重叠
    

注意事项

  • 周数格式:%V是ISO标准周数(周一为周起始),如果你的数据用周日起始的美式周数,替换为%U即可,同时调整week_val的计算逻辑。
  • 若不想用lubridate,也可以用基础R的strptime处理日期,但lubridate的语法更简洁。

内容的提问来源于stack exchange,提问作者Basil Abu Mallooh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:20:26