使用ggplot在R中按周绘制图表

6

我有以下数据:

set.seed(123)
timeseq <- as.Date(Sys.time() + cumsum(runif(1000)*86400))
data <- rnorm(1000)
df <- data.frame(timeseq,data)

我想知道是否有任何方法可以按周聚合数据。我试图绘制一个时间序列ggplot,所以如果能跳过这一步让ggplot来处理就更好了。我已经卡在这里一整天了。


在日期范围内,每周都有一个数据点。该数据点代表rnorm的总和。 - theamateurdataanalyst
4个回答

7

使用dplyr手动按周聚合的另一种方法。

library(dplyr)
df$weeks <- cut(df[,"timeseq"], breaks="week")
agg <- df %>% group_by(weeks) %>% summarise(agg=sum(data))
ggplot(agg, aes(as.Date(weeks), agg)) + geom_point() + scale_x_date() +
    ylab("Aggregated by Week") + xlab("Week") + geom_line()

enter image description here


3

您还可以使用 scale_x_date() 函数的 breaks 参数来汇总日期美学。

ggplot(df, aes(x = timeseq, y = data)) +
    stat_summary(fun.y = sum, geom = "line") +
    scale_x_date(labels = date_format("%Y-%m-%d"),
                 breaks = "1 week")

我认为这只是改变了轴标签,而没有聚合底层数据。我也只能在ggplot2_2.2.1中将“breaks”更改为“date_breaks”,才能使此代码正常工作。 - Craig

0

要获取星期,我们可以使用 lubridate 库,并使用 floor_date 函数,如下所示:

library(lubridate)
df$week <- floor_date(df$timeseq, "week")

我们可以使用ggplot绘制数据,通过进行统计摘要(也许有更好的方法?),它会看起来像这样:
stat_sum_single <- function(fun, geom="point", ...) {
  stat_summary(fun.y=fun, colour="red", geom=geom, size = 3, ...)
}

ggplot(df, aes(x=floor_date(timeseq, "week"), y=data)) + 
  stat_sum_single(sum, geom="line") + 
  xlab("week")

这将会有输出:

enter image description here


0

我想在 @chappers 的想法基础上,以完全管道化的方式使用 lubridate 包。

library(dplyr)
library(ggplot2)
library(lubridate)
set.seed(123)
data.frame(
  timeseq = as.Date(Sys.time() + cumsum(runif(1000) * 86400)),
  data = rnorm(1000)
) %>%
  mutate(timeseq = floor_date(timeseq, unit = "week")) %>%
  group_by(timeseq) %>%
  summarise(data = sum(data)) %>%
  ggplot() +
  geom_line(aes(x = timeseq, y = data))

如果你已经将data.frame存储为一个对象,那么可以用df替换data.frame行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接