182 votes

Ajout d'une ligne de régression sur un ggplot

Je m'efforce d'ajouter une ligne de régression sur un ggplot. J'ai d'abord essayé avec abline mais je n'ai pas réussi à le faire fonctionner. Puis j'ai essayé ceci...

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)

Mais cela ne fonctionne pas non plus.

253voto

Didzis Elferts Points 29673

En général, pour fournir votre propre formule, vous devez utiliser les arguments suivants x y y qui correspondront aux valeurs que vous avez fournies dans ggplot() - dans ce cas x sera interprété comme x.plot y y como y.plot . Vous pouvez trouver plus d'informations sur les méthodes et formules de lissage via la page d'aide de la fonction stat_smooth() car c'est la stat par défaut utilisée par geom_smooth() .

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

Si vous utilisez les mêmes valeurs x et y que celles que vous avez fournies dans le fichier ggplot() et que vous avez besoin de tracer la ligne de régression linéaire, vous n'avez pas besoin d'utiliser la formule dans le tableau suivant geom_smooth() il suffit de fournir le method="lm" .

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

72voto

StefanK Points 690

Comme je viens de le penser, au cas où vous auriez un modèle ajusté par régression linéaire multiple la solution mentionnée ci-dessus ne fonctionnera pas.

Vous devez créer votre ligne manuellement comme un cadre de données qui contient les valeurs prédites pour votre cadre de données original (dans votre cas data ).

Cela ressemblerait à ceci :

# 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

45voto

qwr Points 840

La solution simple et polyvalente consiste à tracer une ligne à l'aide de la fonction slope y intercept de geom_abline . Exemple d'utilisation avec un nuage de points et lm objet :

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 est utilisé pour extraire les coefficients de la formule fournie à lm . Si vous avez un autre objet de modèle linéaire ou une ligne à tracer, il suffit d'entrer les valeurs de pente et d'interception de la même manière.

6voto

YellowEagle Points 59

J'ai trouvé cette fonction sur un blog

 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)))
    }`

une fois que vous avez chargé la fonction, vous pouvez simplement

ggplotRegression(fit)

vous pouvez également opter pour ggplotregression( y ~ x + z + Q, data)

J'espère que cela vous aidera.

2voto

user3436882 Points 41

Si vous souhaitez ajuster d'autres types de modèles, comme une courbe dose-réponse utilisant des modèles logistiques, vous devrez également créer davantage de points de données avec la fonction predict si vous souhaitez obtenir une ligne de régression plus lisse :

fit : votre ajustement d'une courbe de régression logistique

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X