【问题标题】:plotting daily distribution of a time series data in R在 R 中绘制时间序列数据的每日分布
【发布时间】:2023-02-15 22:44:42
【问题描述】:

我有一个时间序列数据(日期列和值列)。我正在尝试每日分布图。

下图中是每周分布图,绘制了一周中几天的值。同样,我正在尝试绘制每日分布图,其中 x 轴为月,y 轴为值,该图有 10 行,其中每行为您提供日期 1、日期 2、日期 3 等等,直到日期 10(因为在一个子图中 30 天会很笨拙,所以我想将地块分为 3、1-10、11-20 和 21-31)

每周分发代码供参考:

#dummy data
start_date <- as.Date("2020-01-01")
end_date <- as.Date("2021-12-31")
date_seq <- seq(from = start_date, to = end_date, by = "day")
set.seed(123)
value <- round(runif(length(date_seq), min = 10000, max = 100000000), 0)
df <- data.frame(date = date_seq, value = value)

df$week_number <- as.numeric(format(as.Date(df$date), "%U")) + 1
df$weekday <- weekdays(as.Date(df$date))
df$year <- as.numeric(format(as.Date(df$date), "%Y"))
years <- unique(df$year)

# Create a list of ggplots, one for each year
plots <- lapply(years, function(y) {
  year_df <- df[df$year == y, ]
  ggplot(year_df, aes(x = week_number, y = value, color = weekday)) +
    geom_line() +
    scale_color_discrete(limits = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")) +
    ggtitle(paste("Weekday Distribution", y)) +
    xlab("Week number") +
    ylab("Value") +
    theme(legend.key.size = unit(0.4, "cm")) +
    theme(plot.title = element_text(hjust = 0.5, vjust = 1.5))
library(cowplot)
plot_grid(plotlist = plots, ncol = 1)

所以最后,将有三个图(1 到 10 个日期、11 到 20 个日期和 21 到 31 个日期),每个图将包含 2 个子图(因为日期范围从 2020 年到 2021 年)。谁能帮我这个?

【问题讨论】:

  • 我觉得这在某种程度上打败了时间序列的要点......? (其中一点是可视化自相关 - 如果您人为地从每个月中仅分离出特定日期,则会丢失此信息)。另外,您将如何处理“第 31 天”?
  • 此外,您可以简单地使用构面,而不是制作图表列表
  • 抱歉,我想在第三个情节中安排第 21 -31 天@tjebo
  • 但是如果我不划分数据,那么我将有 30 行在一个子图中可视化?并且使用调色板很难区分线条
  • 时间序列的全部要点不是划分数据,而是始终将其视为一个整体。如果你想聚合它,有特定的包可以做到这一点,特别注意zoo包。

标签: r ggplot2 plot


【解决方案1】:

下面我将如何做到这一点。 lubridate 包是你的朋友。对于分组,使用削减。

结果是(在我看来)非常无用的混乱线条。但这不是我不认可这种可视化的唯一原因。我觉得这在某种程度上打败了时间序列的要点……其中一点是可视化数据的自相关性。人为地从每个月中仅分离出特定日期会极大地影响使用时间序列的这一特殊优势(也许是原因)。您不仅会丢失信息,还会使您自己的分析生活变得更加复杂。

library(ggplot2)
library(dplyr)
library(lubridate)

df %>%
  mutate(day = mday(date), 
         day_group = cut(day, c(1,11,21, 31), incl = T),
         month = month(date, label = T, abbr = T))  %>%
ggplot(aes(x = month, y = value, color = day, group=interaction(day, day_group))) +
  geom_line() +
  theme(legend.key.size = unit(0.4, "cm"),
        plot.title = element_text(hjust = 0.5, vjust = 1.5), 
        axis.text.x = element_text(angle = 90)) +
  facet_wrap(year~day_group)

【讨论】:

  • 是的,我同意你的解释。我将寻找可视化的替代方案。谢谢@tjebo。
  • @Bella_18 不确定我是否关注?你介意解释一下你的想法吗?
  • 我想要三个单独的图,例如:第一个图仅显示 1 到 10 天(2020 年和 2021 年的 2 个子图),类似的第二个图给出(11 到 20 个两个子图)和第三个图
  • 类似于我在问题中附上的图表(我们有工作日,但这里的情节只包含 10 天)
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多