r - 使 ggplot2 中的 geom_smooth() 适应观测数量

标签 r ggplot2

如何使 ggplotgeom_smooth()method 参数动态化并适应组中数据点的数量?

例如,我有以下格式的数据:

1. DATE PRODUCT SIZE
2. 3/1/2017 A 10
3. 3/2/2017 B 14
4. 3/3/2017 C 25
5. 3/4/2017 A 16
6. etc.

此图表完全正常,并使用以下代码为每个组 (PRODUCT) 添加了黄土拟合(每个 PRODUCT 组大约有 20 个条目):

DT<-read.csv("TEST_DATA.csv")

DT$DATE<-as.Date(DT$DATE, "%m/%d/%Y")

myPlot<-ggplot(DT, aes(DATE, SIZE, color = PRODUCT))

myPlot + geom_point() + geom_smooth(method = "loess", se = FALSE)

但是,假设我只为第四个产品“D”添加 2 个数据点。然后,我收到以下警告消息,并且没有将黄土拟合线添加到任何组的绘图中。

Warning messages:
1: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... : span too small.   fewer data values than degrees of freedom.

我认为此警告是由于产品 D 的观测值数量小于黄土拟合的自由度。

设置method =“auto”,无论如何选择“loess”,这样没有帮助,将method设置为“lm”是这不是我想要的。

我想执行以下操作,但无法完全正常工作,想知道是否有人可以提供帮助?

myPlot + geom_point() + geom_smooth(data = DT, method = if(length(DT$PRODUCT)<5) {"lm"} else {"loess"}, se = F)

如您所见,如果任何组的观测值少于 5 个,我尝试让 geom_smooth() 使用 method = "lm",否则使用 “黄土”方法。但我不太清楚如何在 geom_smooth() 函数中访问每个组的观察数量。

最佳答案

您可以使用一个 n 参数(评估平滑度的点数)。有关详细信息,请参阅 stat_smooth

编辑: 您可以动态构建绘图:

sProduct <- unique(DT$PRODUCT)
myPlot <- ggplot(DT, aes(DATE, SIZE, color = PRODUCT)) + geom_point()

for (i in sProduct){

  sMethod <- ifelse(sum(DT$PRODUCT == i) <= 5, "lm", "loess")
  myPlot <- myPlot + geom_smooth(data = subset(DT, PRODUCT == i), method = sMethod, se = FALSE)
}

myPlot

关于r - 使 ggplot2 中的 geom_smooth() 适应观测数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249325/

相关文章:

r - 如何使用 ggplot2 在情节的不同侧(底部和右侧)放置图例?

r - 在 R 中使用蒙特卡罗模拟的风险值(value)(极值理论)

r - 如何禁用 RMD 文件中代码区域的拼写检查(Markdown、knitr、R)

从 ggplot 或 gtable/gTree/grob/gDesc 对象中检索分面标签

r - 使用 ggplot 绘制函数,相当于 curve()

r - 基于Newton-Raphson和矩量法的最大似然估计

R ggplot - 无法分配大向量

r - ggplot2:如何向上移动 x 轴,使其可以在水平条形图中任意选取的条形下?

r - ggplot2:用图例制作多条线+带

R:值因调用方法而异