如何强制 ggplot 渲染 geom_smooth?

4
我希望强制绘制一个更平滑的线条,即使在一个组只有一个或两个值的情况下,如下所示的多组图:
library(ggplot2)

set.seed(1234)
df <- data.frame(group = factor(c(rep("A",3),rep("B",2),"C")), x = c(1,2,3,1,2,2), value = runif(6))
ggplot(df,aes(x=x,y=value,group=group,color=group))+
  geom_point(size=2)+
  geom_line(stat="smooth",method = "loess",size = 2, alpha = 0.3)

enter image description here

这是我想要看到的输出:

enter image description here


4
当一个组仅有一个值时,预期输出不明确。在有两个值的情况下,可以使用 method = "lm",因为直线已经足够平滑了。在有三个点的情况下,问题不在于“强制”;问题在于loess无法从这么少的点中拟合出平滑的曲线。这时需要使用除loess以外的其他方法。如果你的意思是对每个组的整个x范围绘制光滑曲线,那么问题就更加不明确了。 - Julius Vainora
1
如果所有组都有三个或更多点,则平滑器将呈现。然而,由于loess独立应用于每个组,因此应该有一种方法可以为具有3个或更多点的组呈现它,即使其他组只有2个或一个点。我期望的输出是ggplot仅为组“A”绘制loess平滑器。我可以通过从数据中排除A组和B组(df [df $ group ==“A”])来强制执行此操作,但这不是我想要的。 - Eric
好的,这样问题就清楚了,我建议您相应地更新您的帖子。 - Julius Vainora
2
看起来你解决了?也许更清晰的版本是先绘制点,然后将数据集的过滤版本发送到 geom_line 部分。 - svenhalvorson
似乎这是一种繁琐的方法。1. 过滤所有组>=3,渲染“loess”平滑器。2. 过滤所有组==2,渲染线条。3. 过滤所有组==1,渲染点。4. 合并图表。我希望能够帮助ggplot忽略奇异点,并在单个步骤中为有效组渲染,但也许不行! - Eric
在我看来,我不确定一个loess模型(或者说任何的统计模型)是否适用于如此小的样本,而且我认为这种方法非常直接。 - tjebo
1个回答

5
调用会产生许多警告,可以通过warnings()进行检查。其中一个警告显示“零宽邻域。扩大跨度”。
因此,我尝试了OP的代码,并加入了span = 1参数。
library(ggplot2)
ggplot(df, aes(x = x, y = value, group = group, color = group)) +
  geom_point(size = 2) +
  geom_line(
    stat = "smooth",
    method = "loess",
    span = 1,
    size = 2,
    alpha = 0.3
  )

通过只有3个和2个数据点的数据,我们得到了A组和B组的平滑曲线。

在此输入图片描述


这正是我所需要的。更加优雅的解决方案!谢谢! - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接