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

如何在R语言时间序列图x轴显示实际日期并高亮日期点

如何在时间序列图中显示实际日期并高亮日期点

嘿,我来帮你解决这个问题!你现在遇到的困扰是ts()生成的时间序列默认用数值索引(第1天、第2天...)作为x轴,而非实际日期。其实我们可以换一种更灵活的方式作图——直接用原始DataFrame配合ggplot2,既能轻松控制x轴的日期显示,还能高亮日期点。下面是完整的修改方案:

完整修改后的代码

library(ggplot2)
library(fpp2)
library(tidyverse)
library(lubridate)
library(writexl)
library(plyr)
library(forecast)

# 1. 筛选数据(保留你原本的逻辑)
Sales171819 <- SalesNL[SalesNL$TransactionDate >= "2017-01-01" & SalesNL$TransactionDate <= "2019-12-31",]

# 确保日期列是标准Date类型(保险起见,避免格式异常)
Sales171819$TransactionDate <- as.Date(Sales171819$TransactionDate)

# 2. 绘制带实际日期的时间序列图(带高亮点)
ggplot(Sales171819, aes(x = TransactionDate, y = NetSalesQty)) +
  geom_line(color = "steelblue", linewidth = 0.8) + # 折线主体样式
  geom_point(color = "#e74c3c", size = 1.5) + # 高亮日期点,自定义颜色和大小
  ggtitle("TAF Sales NL 2017/2018") +
  ylab("SalesQty") +
  xlab("Date") +
  scale_x_date(
    date_breaks = "1 month", # 每1个月显示一个日期标签
    date_labels = "%Y-%m"    # 日期显示格式:年-月
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转标签避免重叠

# 3. 绘制带实际日期标签的季节图
Sales171819 %>%
  mutate(
    day_of_year = yday(TransactionDate), # 提取一年中的第几天,用于分组
    year = factor(year(TransactionDate)) # 提取年份,作为分组颜色标识
  ) %>%
  ggplot(aes(x = day_of_year, y = NetSalesQty, color = year)) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 1) + # 高亮每个日期点
  ggtitle("Sales Per Day (Seasonal Trend)") +
  ylab("Sales") +
  xlab("Date") +
  # 把x轴的“一年中的第几天”转换为实际日期标签
  scale_x_continuous(
    breaks = seq(1, 365, 30), # 每30天显示一个标签
    labels = function(x) format(as.Date(paste0("2017-", x), format = "%Y-%j"), "%m-%d")
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(color = "Year") # 图例标题

关键修改说明

  • 放弃ts()对象,直接用原始DataFrame:ts()是为固定频率时间序列设计的,它的x轴是数值索引,很难直接映射实际日期。而用原始的TransactionDate列(Date类型),ggplot2可以自动识别日期格式,轻松控制x轴的显示逻辑。
  • 用geom_point()高亮日期点:你可以自定义点的颜色、大小,让关键日期点更显眼。
  • 自定义日期轴格式:通过scale_x_date()(折线图)和scale_x_continuous()(季节图),我们可以设置日期的显示频率和格式,避免标签重叠影响可读性。

如果一定要用ts()对象的替代方案

如果你坚持要使用ts()对象作图,也可以手动为ts序列匹配日期向量,再修改x轴标签:

# 创建ts对象(保留你的原始代码)
myts <- ts(Sales171819$NetSalesQty, start = decimal_date(as.Date("2017-05-01")), frequency = 365)
# 生成对应每个ts点的日期向量
dates <- seq(as.Date("2017-05-01"), by = "day", length.out = length(myts))

# 修改autoplot的x轴和高亮点
autoplot(myts) +
  geom_point(aes(x = dates, y = myts), color = "#e74c3c", size = 1.5) +
  ggtitle("TAF Sales NL 2017/2018") +
  ylab("SalesQty") +
  xlab("Date") +
  scale_x_continuous(
    breaks = decimal_date(dates)[seq(1, length(dates), 30)],
    labels = function(x) format(as.Date(x, origin = "1970-01-01"), "%Y-%m")
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

不过这种方式相对繁琐,还是推荐直接用DataFrame配合ggplot2的方案,灵活性更高。

内容的提问来源于stack exchange,提问作者Atal Atmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:07:57