【问题标题】:Plot difference over time in R在 R 中绘制随时间的差异
【发布时间】:2016-12-05 15:43:33
【问题描述】:

考虑以下数据:

set.seed(4235)
dates <- c("2016-01-01", "2015-01-01", "2014-01-01", "2013-01-01")
small <- data.frame(group = "small",  n1 = rnorm(4), dates = as.Date(dates))
medium <- data.frame(group = "medium",  n1 = rnorm(4), dates = as.Date(dates))
large <- data.frame(group = "large",  n1 = rnorm(4), dates = as.Date(dates))

data <- rbind(small, medium, large)

这是非常基本的数据,可以这样绘制:

ggplot(data, aes(dates, col = group)) +
  geom_line(aes(y = n1))

但是,假设我想将中小型组与大型组进行对比。换句话说,中小群体与大群体之间的差异。换句话说,大组应该用一条围绕零的直线表示,而其他组应该表示差异。类似于自协方差图的东西。

你知道如何用 ggplot 做到这一点吗?

【问题讨论】:

    标签: r ggplot2 time-series timeserieschart


    【解决方案1】:

    您可能无法直接使用ggplot 进行此操作,尽管首先计算差异相对简单,然后将它们传回ggplot。

    在这里,我使用tidyr 和dplyr 进行操作。首先,我分散数据以将组放在自己的列中(每个日期一行)以进行比较。然后,我mutate 创建感兴趣的差异变量。最后,我将gather 比较回长格式(请注意,这会重复small、medium 和large 中的条目;但是,如果需要,可以使用select 删除这些条目)。然后,只需将结果传递给ggplot 并按照您的意愿进行绘图(这里再次简单的线条)。

    data %>%
      spread(group, n1) %>%
      mutate(large - medium
             , large - small) %>%
      gather(Comparison, Difference, `large - medium`, `large - small`) %>%
      ggplot(aes(x = dates
                 , y = Difference
                 , col = Comparison)) +
      geom_line()
    

    给予:

    【讨论】:

      【解决方案2】:

      这也应该有效:

      library(reshape2)
      df <- dcast(data, dates~group, value.var = 'n1')
      df$diff.small <- df$small - df$large 
      df$diff.medium <- df$medium - df$large 
      df$large <- 0
      data <- subset(melt(df, id='dates'), variable %in% c('diff.small', 'diff.medium', 'large'))
      ggplot(data, aes(dates, fill = variable, col = variable)) +
        geom_ribbon(aes(ymax=value, ymin=0), alpha=0.2) + 
        geom_line(aes(y = value))
      

      【讨论】:

        猜你喜欢
        • 2019-11-26
        • 2013-02-05
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        相关资源
        最近更新 更多