如何使 ggplot
中 geom_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/