【问题标题】:Adding a separate line of regression to ggplot in R在 R 中向 ggplot 添加单独的回归线
【发布时间】:2020-12-11 10:37:47
【问题描述】:

假设我有一个包含以下列标题的数据框:身高、体重、性别。

我正在使用 ggplot 创建散点图。

ggplot(df, aes(x = height, y = weight , col = gender)) +
 geom_point() +
 theme_classic() +
 geom_smooth(method = "lm", se = FALSE)

这为男性和女性绘制了两条回归线。我想为整体比较身高和体重添加另一个回归。我该怎么做?

【问题讨论】:

  • 请添加代码以重现最小版本的 df 数据集。

标签: r ggplot2


【解决方案1】:

您可以添加另一个geom_smooth,并将col 设置为静态标签。这会覆盖第一个 aes(col = gender) 参数,将所有观察结果放回一个组中,并为其指定您要使用的标签:

library(ggplot2)

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, col = Species)) +
  geom_point() +
  theme_classic() +
  geom_smooth(method = "lm", se = FALSE) +
  geom_smooth(aes(col = "Overall"), method = "lm", se = FALSE)
#> `geom_smooth()` using formula 'y ~ x'
#> `geom_smooth()` using formula 'y ~ x'

reprex package (v0.3.0) 于 2020 年 12 月 11 日创建

编辑:跟进下面的问题,这也适用于scale_colour_lancet

library(ggplot2)
library(dplyr)

iris %>% 
  modelr::add_predictions(model = lm(Sepal.Length ~ Sepal.Width + Species, 
                          data = iris)) %>% 
  ggplot(aes(x = Sepal.Width, y = Sepal.Length, col = Species)) +
  geom_point() +
  theme_classic() +
  geom_line(aes(y = pred)) +
  geom_smooth(aes(col = "Overall"), method = "lm", se = FALSE) +
  ggsci::scale_color_lancet()
#> `geom_smooth()` using formula 'y ~ x'

reprex package (v0.3.0) 于 2020 年 12 月 12 日创建

上面使用的geom_smooth 自动为每个分组执行lm(y ~ x),在这种情况下为lm(Sepal.Length ~ Sepal.Width*Species) 提供等效的行。要获得lm(Sepal.Length ~ Sepal.Width + Species),一种简单的方法是使用modelr::add_predictions() 为y 值创建一个pred 变量,然后再传递给ggplot

【讨论】:

  • 您好安德鲁,感谢您的帮助!我的数据集还有一个问题。 “整体”类别没有出现在图例上?有额外的步骤吗?
  • 有几种可能的原因 - 在上面的示例中,它显示为两个 geom_smooth()s 之间的 aes(col) 调用自然地将“整体”添加到要传递到的中断列表中传奇。如果您使用scale_colour_manual 并且不为其分配值,则它可能不会出现。此外,请确保它在aes() 括号内分配。如果您仍然遇到问题,请随时将新代码附加到您的问题中,看看是否缺少某些内容。
  • 或者,如果您有数据集示例,您可以发布我们可以尝试使用您的数据吗?
  • 我确定了为什么整体没有出现在图例中的问题。如果做geom_smooth(aes(col = "Overall"), method = "lm", linetype = "dashed", se = FALSE) 它会出现,但它会删除其中一个类别变为空白。如果我这样做 geom_smooth(aes(col = "Overall"), method = "lm", colour = "black", linetype = "dashed", se = FALSE) 它不会显示。我有 9 个类别
  • 太棒了!非常感谢
猜你喜欢
  • 2013-03-16
  • 2021-03-25
  • 2021-05-21
  • 2018-08-28
  • 2021-04-16
  • 1970-01-01
  • 2021-01-14
  • 2016-02-14
相关资源
最近更新 更多