如何使来自method
的{{1}} geom_smooth()
参数变为动态并适应组中数据点的数量?
例如,我有以下格式的数据:
ggplot
此图表完全正常,并使用以下代码为每个组(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
组有大约20个条目):
PRODUCT
但是,假设我为第4个产品“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)
”添加了2个数据点。然后,我收到以下警告消息,并且没有任何黄土拟合线添加到任何组的图中。
D
我相信这个警告是因为产品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"
并不是我想要的。
我想做以下但不能完全开始工作,我想知道是否有人可以提供帮助?
"lm"
如您所见,如果任何群组的观察次数少于5次,我会尝试myPlot + geom_point() + geom_smooth(data = DT, method = if(length(DT$PRODUCT)<5) {"lm"} else {"loess"}, se = F)
使用geom_smooth()
,否则请使用method = "lm"
方法。但我无法弄清楚如何在"loess"
函数中访问每个组的观察数量。
答案 0 :(得分:1)
您可以根据最小组长度编写一个有条件地选择平滑方法的函数。例如:
iris
让我们运行该功能。对于conditional_smooth(iris, "Petal.Length", "Sepal.Length", "Species")
数据框,最小的组的长度为50。
conditional_smooth(iris[c(1:50,97:150), ], "Petal.Length", "Sepal.Length", "Species")
现在让我们将一组缩短为四个值:
input[class=inputtext]
答案 1 :(得分:0)
您可以使用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