在ggplot上添加回归线

189

我正在努力在ggplot上添加一个回归线。 我先尝试使用abline,但无法使其正常工作。 然后我尝试了这个...

data = data.frame(x.plot=rep(seq(1,5),10),y.plot=rnorm(50))
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
   geom_smooth(method='lm',formula=data$y.plot~data$x.plot)

但它也不起作用。


这个回答解决了您的问题吗?在图表中添加回归线方程和R^2。 - tjebo
6个回答

259

一般来说,如果您想提供自己的公式,应该使用参数xy,它们将对应于您在ggplot()中提供的值-在这种情况下,x将被解释为x.ploty将被解释为y.plot。有关平滑方法和公式的更多信息,请参阅函数stat_smooth()的帮助页面,因为它是geom_smooth()使用的默认统计方法。

ggplot(data,aes(x.plot, y.plot)) +
  stat_summary(fun.data=mean_cl_normal) + 
  geom_smooth(method='lm', formula= y~x)

如果你在ggplot()中使用的是相同的x和y值,并且需要绘制线性回归线,则不需要在geom_smooth()中使用公式,只需提供method="lm"即可。

ggplot(data,aes(x.plot, y.plot)) +
  stat_summary(fun.data= mean_cl_normal) + 
  geom_smooth(method='lm')

1
@ Didzis Elferts 有没有办法在使用geom_smooth时显示回归线的斜率?谢谢。 - Alex

72

正如我刚刚发现的那样,如果你拥有一个基于多元线性回归的模型,上述解决方案将不起作用。

你需要手动创建一行数据框,其中包含原始数据框(在你的情况下是data)的预测值。

它应该像这样:

# read dataset
df = mtcars

# create multiple linear model
lm_fit <- lm(mpg ~ cyl + hp, data=df)
summary(lm_fit)

# save predictions of the model in the new data frame 
# together with variable you want to plot against
predicted_df <- data.frame(mpg_pred = predict(lm_fit, df), hp=df$hp)

# this is the predicted line of multiple linear regression
ggplot(data = df, aes(x = mpg, y = hp)) + 
  geom_point(color='blue') +
  geom_line(color='red',data = predicted_df, aes(x=mpg_pred, y=hp))

多个LR

# this is predicted line comparing only chosen variables
ggplot(data = df, aes(x = mpg, y = hp)) + 
  geom_point(color='blue') +
  geom_smooth(method = "lm", se = FALSE)

单个LR


8
需要注意的一件事是约定俗成的表达方式为lm(y~x)。读到这个式子时,我有些困惑,因为你要“预测”的变量在x轴上。不过回答很棒。 - colorlace

47

简单而多用的解决方案是使用 slopeinterceptgeom_abline 绘制一条线。在散点图和 lm 对象中的示例用法:

library(tidyverse)
petal.lm <- lm(Petal.Length ~ Petal.Width, iris)

ggplot(iris, aes(x = Petal.Width, y = Petal.Length)) + 
  geom_point() + 
  geom_abline(slope = coef(petal.lm)[["Petal.Width"]], 
              intercept = coef(petal.lm)[["(Intercept)"]])

示例图

coef 用于提取提供给 lm 的公式的系数。如果您有其他线性模型对象或要绘制的直线,则类似地插入斜率和截距值即可。


3
因此,您不必担心公式的顺序或只需添加 +0,您可以使用名称。例如:data.lm$coefficients[['(Intercept)']]data.lm$coefficients[['DepDelay']] - Ufos
1
几乎总是(Intercept)会被列在首位。这些名称确实使代码更清晰。 - qwr
2
我认为这是最好的答案 - 它是最通用的。 - arranjdavis
1
我该如何利用它(绘制它)? - Ben
1
@Ben 抱歉回复晚了。由于这个答案引起了一些关注,我已经添加了一个 MWE 的详细信息。 - qwr
显示剩余2条评论


2
如果您想适用其他类型的模型,例如使用逻辑回归模型的剂量-反应曲线,您还需要使用函数“predict”创建更多数据点,以便获得更平滑的回归线:

fit:逻辑回归曲线的拟合结果

#Create a range of doses:
mm <- data.frame(DOSE = seq(0, max(data$DOSE), length.out = 100))
#Create a new data frame for ggplot using predict and your range of new 
#doses:
fit.ggplot=data.frame(y=predict(fit, newdata=mm),x=mm$DOSE)

ggplot(data=data,aes(x=log10(DOSE),y=log(viability)))+geom_point()+
geom_line(data=fit.ggplot,aes(x=log10(x),y=log(y)))

1

2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

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