在 R 中绘制随时间变化的差异

Plot difference over time in R

考虑以下数据:

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 做到这一点吗?

你可能不能直接用 ggplot 来做,尽管先计算差异然后将它们传回 ggplot 相对简单。

在这里,我使用 tidyrdplyr 进行操作。首先,我将数据分散到各组中(每个日期一行),以便进行比较。然后,我 mutate 创建感兴趣的差异变量。最后,我 gather 将比较变回长格式(请注意,这会重复 smallmediumlarge 中的条目;但是,可以使用 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()

给出:

这也应该有效:

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))