如何在 R 中为具有分类间隔的时间序列数据绘制一条线

数据挖掘 时间序列 r 绘图 ggplot2
2022-02-18 02:27:28

我正在处理要在大约 1 周的时间窗口内绘制的单个时间序列测量值。

是我正在使用的数据。

这是我的 R 脚本:

library(tidyverse)
library(ggplot2)

filesource <- "C:/ ... /testData.csv"
df <-read.csv(filesource, header = TRUE)

ggplot() +
  geom_line(data = df, aes(x = date, y = value, group = 1), color = "red") +
  ggtitle("Some Measure over Time") +
  xlab("Time") +
  ylab("Some Measure in %")

这产生了这个情节。

x 轴上带有日期时间的时间序列数据

我想要的是像这样在 x 轴上显示各个独特的工作日,就好像我会将日子绘制为单独的类别,但只显示每天的第一个。我无法真正对此进行硬编码,因为我正在与不同的参与者、天数和每天的价值金额一起工作。

预期结果: 期望的结果

所以我用工作日创建了一个新变量:

df$day <- weekdays(as.Date(df$date, '%d-%m-%Y'))

在此处输入图像描述

但是,当我想将此列用作 x 轴变量时,天的顺序不正确,并且一天的所有值显然都绘制在每一天的顶部:

geom_line(data = df, aes(x = day, y = value, group = 1), color = "red")

在此处输入图像描述

我已经看到这在 python 中有所解决:Visualizing Time Series Data

但是,我真的很想使用 R 和 Markdown 来创建自动参与者报告。如果使用 R 中的另一个绘图功能更容易做到这一点,我很乐意接受。我只是喜欢 ggplot 的可定制性。

我希望我的例子很清楚。我想这可以通过正确的 ggplot() 参数和设置来解决。有没有人有一个解决方案来结束更像预期结果蒙太奇的东西?

1个回答

像这样的东西会起作用吗?我只是添加了一个额外的列来指示行号(稍后用作 x 轴),以确保所有值都显示为新点,而不是在同一天绘制在彼此之上。然后,我通过选择每天的第一行来指定自定义 x 刻度和标签,并获取行号(指定必须在何处绘制刻度和标签)和日期名称(指定标签应显示的内容)。

library(readr)
library(ggplot2)

df <- read_csv("testData.csv") %>%
  mutate(
    date = as.Date(date, "%d-%m-%Y"),
    day = weekdays(date),
    row = row_number()
)
ticks <- df %>% group_by(day) %>% filter(row_number() == 1) %>% select(row)

ggplot() +
  geom_line(data = df, aes(x = row, y = value, group = 1), color = "red") +
  ggtitle("Some Measure over Time") +
  xlab("Time") +
  ylab("Some Measure in %") + 
  scale_x_continuous(breaks=pull(ticks, row), labels=pull(ticks, day))

在此处输入图像描述