这是一个很好的例子,说明了为什么它有助于提供一个最小的可重现的例子。您已经提供了产生错误的代码,但代码本身没有任何问题:它只会在某些输入时导致此错误。给定合适的数据,您的代码就可以了。
让我们创建一个与您的数据框具有相同名称和列名的虚拟数据框。我们将制作 2020 年的前 330 天的数据,我们将在 4 组中Str
,因此总共 1320 行:
library(tidyquant)
library(ggplot2)
set.seed(1)
data <- data.frame(x = rep(seq(as.Date("2020-01-01"),
by = "day", length.out = 330), 4),
y = as.vector(replicate(4, 1000 * cumsum(rnorm(330)))),
Str = rep(c("A", "B", "C", "D"), each = 330))
现在,如果我们使用您的确切绘图代码,我们可以看到绘图很好:
ggplot(data, aes(x, y, color = Str)) +
geom_point(stat="identity") +
geom_ma(ma_fun = SMA, n = 20, linetype = 1, size = 1, na.rm = TRUE)
但是,如果我们的一个或多个Str
小组的测量值少于 20 次,那么我们就会得到您的错误。让我们删除大部分的Str == "A"
andStr == "B"
情况,然后重复这个情节:
data <- data[c(1:20 * 33, 661:1320),]
ggplot(data, aes(x, y, color = Str)) +
geom_point(stat="identity") +
geom_ma(ma_fun = SMA, n = 20, linetype = 1, size = 1, na.rm = TRUE)
#> Warning: Computation failed in `stat_sma()`:
#> n = 20 is outside valid range: [1, 10]
我们得到了您的确切警告,并且 MA 线从所有组中消失了。显然,如果我们只有 10 个数据点,我们无法获得 20 次测量的移动平均值,所以geom_ma
就放弃吧。
这里的解决方法是使用data =
参数 ingeom_ma
过滤掉任何少于 20 个数据点的组:
ggplot(data, aes(x, y, color = Str)) +
geom_point(stat="identity") +
geom_ma(ma_fun = SMA, n = 20, linetype = 1, size = 1, na.rm = TRUE,
data = data[data$Str %in% names(table(data$Str)[table(data$Str) > 20]),])