虽然我们没有您的特定数据集,但这里有一种基于使用 mtcars 数据集的方法。首先,让我们画一个类似于 OP 分享的图:
df <- mtcars
ggplot(df, aes(disp, mpg)) + theme_bw() +
geom_point(color='gray60') +
geom_smooth(formula=y~x, method='loess', color='green3', se=FALSE, size=0.5) +
geom_smooth(formula=y+1~x, method='loess', color='gray20', se=FALSE, size=0.5) +
geom_smooth(formula=y-1~x, method='loess', color='gray20', se=FALSE, size=0.5)
如您所见,上行和下行分别是通过在公式的 y 值上添加 +1 或 -1 来创建的。
我们在这里采用的方法是为数据集中的每个 x 值(df$mpg 的每个值)定义使用 loess() 方法预测的“上”和“下”线。然后,我们可以使用这些值与每个给定 df$mpg 的实际值 df$disp 进行比较,以确定它是在“内部”还是“外部”这些限制。
一、上下线的公式,以及上下值的预测:
fla_upper <- loess(formula=mpg+1 ~ disp, mtcars)
fla_lower <- loess(formula=mpg-1 ~ disp, mtcars)
df$upper <- predict(fla_upper, newdata=df)
df$lower <- predict(fla_lower, newdata=df)
现在我们可以创建一个df$region 列来描述每个点在数据集中的位置:
df$region <- ifelse(df$mpg <= df$upper & df$mpg >= df$lower, 'inside','outside')
最后,要创建情节,我们可以使用df$region 来进行颜色美学。我还在这里明确定义了美学的颜色,因为默认配色方案不能清楚地说明这一点:
ggplot(df, aes(disp, mpg)) + theme_bw() +
geom_point(aes(color=region)) +
geom_smooth(formula=y~x, method='loess', color='green3', se=FALSE, size=0.5) +
geom_smooth(formula=y+1~x, method='loess', color='gray20', se=FALSE, size=0.5) +
geom_smooth(formula=y-1~x, method='loess', color='gray20', se=FALSE, size=0.5) +
scale_color_manual(values=c('inside'='red', 'outside'='gray80'))
要完全过滤掉那些“外部”点,您可以使用subset() 并将其应用于geom_point() 数据字段:
ggplot(df, aes(disp, mpg)) + theme_bw() +
geom_point(data=subset(df, region=='inside'), color='red') +
geom_smooth(formula=y~x, method='loess', color='green3', se=FALSE, size=0.5) +
geom_smooth(formula=y+1~x, method='loess', color='gray20', se=FALSE, size=0.5) +
geom_smooth(formula=y-1~x, method='loess', color='gray20', se=FALSE, size=0.5)
现在,在应用到您自己的数据时,您可以使用类似的方法。但是,您定义了绘制上线和下线,只需将该公式应用于数据集中的 x 值即可创建“上”和“下”区域。然后将实际的 y 值与预测的上限和下限进行比较。