【问题标题】:Geom_smooth doesn't plot on ggplot2Geom_smooth 不在 ggplot2 上绘图
【发布时间】:2021-08-08 21:17:36
【问题描述】:

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

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()

【问题讨论】:

  • 可能是因为 x 变量是离散的。尝试将geom_smooth() 中的组设置为-1 之类的。
  • 您得到一个“可能”的答案,因为您没有提供问题的可重现示例stackoverflow.com/help/minimal-reproducible-example
  • OP,听从/u/teunbrand的建议。将geom_smooth() 更改为geom_smooth(aes(group=-1),您将得到电话。当然,你的轴仍然是离散的,所以它不会是一条平滑的线,但是这样 ggplot 知道连接点。如果您想要一条平滑的线条,则需要创建一个连续的新列,然后可以使用scale_x_continuous() 标记您的中断。

标签: r ggplot2 smoothing


【解决方案1】:

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

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

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

要获得一条“不平滑”的线,您需要做的就是告诉ggplot2,x 轴上的点都在该维度上连接,并且它应该使用级别的数值分配给x 轴。如果不以数字方式处理比例,则无法沿该轴计算公式,因此这是必要的。由于在这种情况下轴仍然是离散的,因此如果它位于沿 x 的任意两个值之间,则没有任何意义,因此您得到的线将是有角度的(不平滑)。感谢@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 中的所有点。我为此创建了一个名为 df 的新 data.frame:

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
  )

【讨论】:

    猜你喜欢
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2021-11-23
    • 2020-06-06
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多