【发布时间】:2020-03-20 00:53:56
【问题描述】:
我今天在The New York Times 看到了这篇关于冠状病毒的文章,我喜欢这些图表的呈现方式。我知道条形图可以只是在 ggplot 中使用 geom_col() 但我对平滑部分更感兴趣。就像这张图:
他们说“每条红线都是 7 天移动平均线,可以消除日常异常情况……”你是怎么做到的?我有一个数据集,我计划以类似的方式呈现它。
谢谢!
【问题讨论】:
标签: r ggplot2 moving-average
我今天在The New York Times 看到了这篇关于冠状病毒的文章,我喜欢这些图表的呈现方式。我知道条形图可以只是在 ggplot 中使用 geom_col() 但我对平滑部分更感兴趣。就像这张图:
他们说“每条红线都是 7 天移动平均线,可以消除日常异常情况……”你是怎么做到的?我有一个数据集,我计划以类似的方式呈现它。
谢谢!
【问题讨论】:
标签: r ggplot2 moving-average
data.table 也有一个滚动均值函数frollmean,可用于此目的:
library(data.table)
library(ggplot2)
library(scales)
# create some data
set.seed(1)
DT <- data.table(N = rescale(dnorm(seq(-10, 10, by=.1)) +
runif(201, -.1, .1), c(1, 800)))
# apply rolling mean over 10 data points
DT[, `:=`(rollN = frollmean(N, n = 10, align = "center"), idx = .I)]
ggplot(DT, aes(x=idx, y=N)) +
theme_bw() +
geom_line() + # original data
geom_line(data=DT, aes(x=idx, y=rollN), colour = "red", size = 2) + # rolling mean
geom_histogram(aes(x=idx, weight = N/10), binwidth = 10, inherit.aes = FALSE, fill="red", alpha = .2) # histogram
#> Warning: Removed 9 row(s) containing missing values (geom_path).
由reprex package (v0.3.0) 于 2020-03-19 创建
【讨论】:
这需要 3 个点的 3 个周期移动平均线,直到当前点(包括当前点)。前两点是 NA,因为没有 3 点,第三点是 (1+2+3)/3=2,第四点是 (2+3+4)/3=3,依此类推。如果您不想要 NA,请省略 fill = NA。如果您想要居中移动平均线,请删除 rollmeanr 末尾的 r。
library(zoo)
x <- 1:10 # test input
rollmeanr(x, 3, fill = NA)
## [1] NA NA 2 3 4 5 6 7 8 9
要取 3 个或更少点的平均值,请使用具有 partial=TRUE 的 rollapplyr。这里输出的第一个点只有 1,因为 1 的平均值是 1。第二个是 (1+2)/2=1.5,其余同上。
rollapplyr(x, 3, mean, partial = TRUE)
## [1] 1.0 1.5 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
有关详细信息,请参阅 ?rollapply。
【讨论】:
遍历数据集:您保留一个包含 7 个数据的数组并计算平均值。然后向前移动一个数据点,将新的数据点推入你的数组,并弹出最旧的数据点,然后重新计算。
【讨论】: