157

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

但它也不起作用。

4

5 回答 5

220

通常,要提供您自己的公式,您应该使用参数xy这将对应于您提供的值ggplot()- 在这种情况下,x将被解释为x.plot和。您可以通过函数的帮助页面找到有关平滑方法和公式的更多信息,因为它是.yy.plotstat_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')
于 2013-03-27T08:43:42.027 回答
59

正如我刚刚想到的,如果您有一个适合多元线性回归的模型,上述解决方案将不起作用。

您必须手动将您的行创建为包含原始数据框的预测值的数据框(在您的情况下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

于 2017-09-14T10:47:39.057 回答
35

简单而通用的解决方案是使用slopeinterceptfrom画一条线geom_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。如果您有一些其他线性模型对象或线要绘制,只需插入斜率并类似地截取值。

于 2018-10-12T05:12:01.723 回答
5

我在博客上找到了这个功能

 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)

希望这可以帮助。

于 2018-07-03T18:08:15.787 回答
2

如果您想拟合其他类型的模型,例如使用逻辑模型的剂量反应曲线,您还需要使用函数 predict 创建更多数据点,如果您想要更平滑的回归线:

拟合:逻辑回归曲线的拟合

#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)))
于 2018-03-02T21:59:04.747 回答