0

我使用 ggplot 绘制了四个类别。我想使用 geom_ma 添加移动平均线,但我的绿点太少而无法获得良好的移动平均线(我希望至少有 20 个周期)。如何保持散点图不变,只添加紫色和蓝色点的 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)

我收到错误消息:“警告消息:计算失败stat_sma():n = 20 超出有效范围:[1, 10]”

4

1 回答 1

0

这是一个很好的例子,说明了为什么它有助于提供一个最小的可重现的例子。您已经提供了产生错误的代码,但代码本身没有任何问题:它只会在某些输入时导致此错误。给定合适的数据,您的代码就可以了。

让我们创建一个与您的数据框具有相同名称和列名的虚拟数据框。我们将制作 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]),])

在此处输入图像描述

于 2020-12-01T20:56:29.200 回答