在ggplot上添加回归线


120

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

但这也不起作用。

Answers:


170

在一般情况下,提供自己的公式,你应该使用的参数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')

46

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

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


1
要注意的一件事是约定是lm(y〜x)。由于您要“预测”的变量在x轴上,因此我稍稍转了一下以阅读此内容。很好的答案。
colorlace

14

显而易见的解决方案是geom_abline

geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])

哪里data.lm是一个lm对象,data.lm$coefficients看起来是这样的:

data.lm$coefficients
(Intercept)    DepDelay 
  -2.006045    1.025109 

在实践中,相同地使用stat_function来绘制回归线作为x的函数,方法是predict

stat_function(fun = function(x) predict(data.lm, newdata = data.frame(DepDelay=x)))

由于默认情况下n=101会计算点,因此效率较低,但灵活性更高,因为它将为支持的任何模型绘制预测曲线predict,例如npreg来自软件包np 的非线性。

注意:如果使用scale_x_continuous或,scale_y_continuous某些值可能会被截断,因此geom_smooth可能无法正常工作。使用coord_cartesian缩放代替


2
因此,您不必担心公式的顺序或只添加一个+0就可以使用名称。data.lm$coefficients[['(Intercept)']]data.lm$coefficients[['DepDelay']]
Ufos

(几乎)总是(Intercept)将首先列出。名称确实使代码更清晰。
qwr

我认为这是最好的答案-它用途最多。
arranjdavis

4

我在博客上发现了此功能

 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)

希望这可以帮助。


2

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

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

#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)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.