Geom_smooth 不在 ggplot2 上绘制

Geom_smooth doesn't plot on ggplot2

我正在尝试制作平滑曲线,但我不知道为什么不起作用。 这是我的数据集

data.fam
###specnumber_f site  position
             23   MS  on
              9   MS  on
             11   CU  on
              9   CA  on
             21   CF  on
             17   ST  on
              6   AB  on
              4   AB  on
              8   AB  on
              3   FN off
              4   FN off
             14   RO off
              6   RO off
              7 SPSP off
              4 SPSP off
              3 SPSP off

我需要 x 轴遵循此站点顺序

lat.order <- factor(data.fam$site, levels=c("MS", "CU", "CA", "CF", "ST", "AB", "FN",
"RO", "SPSP")) 

然后,我尝试了这段代码,但 geom_smooth 没有绘图,我相信这是一个简单的答案,我无法解决它

ggplot(data.fam, aes(x=as.factor(lat.order), y=specnumber_f))+
  geom_point(aes(colour = factor(position)), size = 2)+
  geom_smooth()

OP。你的线没有显示的原因是你的 x 轴值是离散的。实际上,ggplot2 不知道如何沿 x 轴连接数据,因为对于离散数据,没有明显的理由要沿该轴连接。

这里有两个通用的解决方案。一个很简单,给你一条边缘硬的线,而另一个更复杂,但你会得到一条边缘完全光滑的线。

简单的解决方案:线条不平滑

要得到一条“不平滑”的线,您需要做的就是告诉 ggplot2 沿 x 轴的点都在那个维度上相连,并且它应该使用要分配给 x 轴的级别。如果不以数字方式处理刻度,就无法计算沿该轴的公式,因此这是必要的。由于在这种情况下轴仍然是离散的,因此如果它位于沿 x 的任意两个值之间,则没有任何意义,因此您得到的线将是 angular(不平滑)。感谢@teunbrand 提供此解决方案:

ggplot(data.fam, aes(x=site, y=specnumber_f)) +
  geom_point() + geom_smooth(aes(group=-1))

获得平滑的线条

如果您对简单的解决方案在美学上感到满意,那么它是最简单的,所以请采用它。如果你真的想要一条平滑的线,这里有一种方法可以做到。基本思想是我们需要将您的离散轴更改为连续轴。问题是 data.fam$site 不是连续的。因此,我们需要基本上将 data.fam$site 的值映射到另一个数字列,然后使用 scale_x_continous() 来标记我们的轴,并使用 data.fam$site.

中的正确名称

首先,我们将轴标签的顺序放在一边:

lat.order.levels <- c("MS", "CU", "CA", "CF", "ST", "AB", "FN",
                      "RO", "SPSP")

然后,我们制作另一个数据框,用于将我们的连续列(此处为 site_num)映射到原始数据框,data.fam

site.data <- data.frame(
  site = lat.order.levels,
  site_num = 1:length(lat.order.levels)
)

最后,我们合并两帧,保留所有点在data.fam中。我为此创建了一个新的 data.frame df:

df <- dplyr::left_join(data.fam, site.data, by= "site")

对于绘图,您将 x 美学分配给 site_num,并使用 lat.order.levels 通过 scale_x_continuous() 标记轴。

ggplot(df, aes(x=site_num, y=specnumber_f)) +
  geom_point() + geom_smooth() +
  scale_x_continuous(
    breaks=1:length(lat.order.levels),
    labels=lat.order.levels
  )