在 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
相对简单。
在这里,我使用 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()
给出:
这也应该有效:
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))
考虑以下数据:
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
相对简单。
在这里,我使用 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()
给出:
这也应该有效:
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))