代码之家  ›  专栏  ›  技术社区  ›  apitsch

R-用ggplot2绘制线图中不同时间序列的滚动平均值

  •  1
  • apitsch  · 技术社区  · 8 年前

    我想用 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
    

    现在,下面的代码创建了一个图,其中时间=1和时间=2的行将不代表数据,因为 value 填充了NAs和中的第一个数字项 价值 表示时间=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)))
    

    Plot result

    如何调整代码,使滚动平均线代表我的数据?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Jack Brookes    8 年前

    你的问题是你在整列上应用移动平均值,这使得数据从 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)))
    

    enter image description here