在 ggplot 上添加回归线

我正努力在 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)

但它也没有起作用。

541386 次浏览

一般来说,为了提供您自己的公式,您应该使用与您在 ggplot()中提供的值对应的参数 xy-在这种情况下,x将被解释为 x.plot,而 y将被解释为 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)

如果您使用的 x 和 y 值与在 ggplot()调用中提供的相同,并且需要绘制线性回归线,那么您不需要在 geom_smooth()中使用公式,只需提供 method="lm"

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

正如我刚刚想到的,如果你有一个 模型装配在多个线性回归上,上面提到的解决方案不会工作。

您必须手动创建一个包含原始数据帧(在您的例子中是 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))

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

Single LR

如果你想适应其他类型的模型,比如使用逻辑模型的剂量-反应曲线,你还需要创建更多的数据点,如果你想有一个更平滑的回归线:

拟合: 你的 Logit模型曲线拟合

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

我在 博客上找到了这个函数

 ggplotRegression <- function (fit) {


`require(ggplot2)


ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) +
geom_point() +
stat_smooth(method = "lm", col = "red") +
labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
"Intercept =",signif(fit$coef[[1]],5 ),
" Slope =",signif(fit$coef[[2]], 5),
" P =",signif(summary(fit)$coef[2,4], 5)))
}`

一旦你加载了这个函数,你就可以

ggplotRegression(fit)

你也可以选择 ggplotregression( y ~ x + z + Q, data)

希望这个能帮上忙。

简单而通用的解决方案是使用 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)"]])

Example plot

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

使用 geom _ line ()添加回归线的另一种方法是使用扫帚包获取拟合值并使用它,如下所示 Https://cmdlinetips.com/2022/06/add-regression-line-to-scatterplot-ggplot2/