我想用.绘制不同时间序列数据的滚动平均值ggplot2。我的数据具有以下结构:
library(dplyr)
library(ggplot2)
library(zoo)
library(tidyr)
df <- data.frame(episode=seq(1:1000),
t_0 = runif(1000),
t_1 = 1 + runif(1000),
t_2 = 2 + runif(1000))
df.tidy <- gather(df, "time", "value", -episode) %>%
separate("time", c("t", "time"), sep = "_") %>%
subset(select = -t)
> head(df.tidy)
# episode time value
#1 1 0 0.7466480
#2 2 0 0.7238865
#3 3 0 0.9024454
#4 4 0 0.7274303
#5 5 0 0.1932375
#6 6 0 0.1826925
Run Code Online (Sandbox Code Playgroud)
现在,下面的代码创建了一个图,其中时间 = 1 和时间 = 2 的线在剧集开始时不代表数据,因为value填充了 NA 并且第一个数字条目value是时间 = 0。
ggplot(df.tidy, aes(x = episode, y = value, col = time)) +
geom_point(alpha = 0.2) +
geom_line(aes(y = rollmean(value, 10, align = "right", fill = NA)))
Run Code Online (Sandbox Code Playgroud)
我必须如何调整我的代码,使滚动平均线代表我的数据?
您的问题是您在整列上应用移动平均值,这会使数据从一个值“泄漏”time到另一个值。
您可以group_by先分别将 应用于rollmean每次:
ggplot(df.tidy, aes(x = episode, y = value, col = time)) +
geom_point(alpha = 0.2) +
geom_line(data = df.tidy %>%
group_by(time) %>%
mutate(value = rollmean(value, 10, align = "right", fill = NA)))
Run Code Online (Sandbox Code Playgroud)