Comment afficher automatiquement l’équation d'une droite sur un ggplot2 ?

afficher une équation de droit sur un ggplot

Lorsque j’anime des formations sur la réalisation de graphiques sous R avec le package ggplot2, je me sers du scatterplot pour expliquer le principe et le fonctionnement du package.

Parmi les éléments que je montre, il y a la couche geom_smooth(), qui permet ultra rapidement et ultra facilement de rajouter une courbe de tendance, ou une droite de régression linéaire, si on ajoute method="lm".

Par exemple :

library(ggplot2)
ggplot(iris, aes(y=Petal.Length, x=Petal.Width))+
    geom_point()+
    geom_smooth(method="lm") 
réalisation d'une droite avec ggplot2

Et très souvent, les stagiaires me demandent :

“Est-ce qu’on peut ajouter l’équation de la droite ?”.

Alors OUI ! On peut !

Je vous montre deux solutions, dont une complètement automatique.

Ajouter l'équation à la main

J’avais déjà montré comment ajouter l’équation “à la main” avec la couche annotate(), dans l’article  “La régression linéaire simple avec le logiciel R

Par exemple, avec les données précédentes, les commandes sont :

# ajustement du modèle de régression linéaire simple
lm1 <- lm(Petal.Length~Petal.Width, data=iris)


# affichage des résultats
summary(lm1)
## 
## Call:
## lm(formula = Petal.Length ~ Petal.Width, data = iris)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.33542 -0.30347 -0.02955  0.25776  1.39453 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.08356    0.07297   14.85   <2e-16 ***
## Petal.Width  2.22994    0.05140   43.39   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4782 on 148 degrees of freedom
## Multiple R-squared:  0.9271, Adjusted R-squared:  0.9266 
## F-statistic:  1882 on 1 and 148 DF,  p-value: < 2.2e-16


# réalisation du plot avec les informations récupérées dans la sortie
ggplot(iris, aes(y=Petal.Length, x=Petal.Width))+
    geom_point()+
    geom_smooth(method="lm")+
   annotate("text", x = 0.5, y = 6, label = "Petal.Length = 1.08 + 2.23 * Petal.Width\n (pval<0.001)", size=2) 
Ajouter manuellement l'équation

Ça fonctionne bien, mais je viens de découvrir qu’il existe une solution complètement automatisée grâce à  l’excellent package ggpubr !

Vous allez voir c’est très simple.

Ajouter automatiquement l'équation avec le package ggpubr

Parmi les fonctions très utiles de ce package ggpubr, il y a la fonction stat_regline_equation(), qui va faire le job, à notre place !

library(ggpubr)

ggplot(iris, aes(y=Petal.Length, x=Petal.Width))+
    geom_point()+
    geom_smooth(method="lm")+
    stat_regline_equation() 

Par défaut, la fonction n’affiche que l’équation.  Mais il est possible d’obtenir le R2 (mais à priori pas la pvalue), ou encore de modifier le positionnement (avec les arguments label.x, label.y), la taille (size) du texte et sa couleur (colour) :

ggplot(iris, aes(y=Petal.Length, x=Petal.Width))+
    geom_point()+
    geom_smooth(method="lm")+
    stat_regline_equation(
    aes(label =  paste(..eq.label.., ..adj.rr.label.., sep = "~~~~")),label.x=1, label.y=1, size=3, colour="blue") 

Et ça fonctionne aussi avec le facet :

ggplot(iris, aes(y=Petal.Length, x=Petal.Width, colour=Species))+
	geom_point()+
	geom_smooth(method="lm")+
	stat_regline_equation(
    aes(label =  paste(..eq.label.., ..adj.rr.label.., sep = "~~~~")),label.x=0.25, label.y=1, size=3)+
	facet_wrap(~Species)+
	theme(legend.position = "non") 

Pas mal tout de même, non ??

Vous trouverez d’autres exemples sur la page d’aide de la fonction, ici.

Et si vous voulez enfin apprendre à  dompter ggplot2, à réaliser les principaux graphiques (scatterplot, boxplot, barplot, lineplot, series temporelles, moyennes avec IC, etc.. ), et l’utiliser de manière performante, vous pouvez me rejoindre sur la prochaine séance de formation, qui aura lieu le 22 février (attention, nombre de places limité à 5).

Vous trouverez toutes les informations (programme, tarif, bulletin d’inscription) ci-dessous 👇👇👇👇

Si cet article vous a plu, ou vous a été utile, vous pouvez soutenir le blog, en réalisant un don libre sur sa page Tipeee.

Poursuivez votre lecture

5 réponses

  1. Bonjour,
    Merci pour vos articles toujours aussi utile.
    J’ai cherché par tous les moyens à générer un tableau automatique depuis ggplot2 pour indiquer les nombre d’observation pris en compte à chaque de temps (x= variable temps en semaines) et y =variable numériques, à partir de données longitudinales.
    Savez-vous si cela est possible ou même avec un autre package?
    Cordialement

    1. Bonjour,
      je pense que c’est possible, mais je n’ai pas d’indication précise. Allez voir du côté de ggpubr, ggstatplot, et GGally.
      Bien à vous.

  2. Bonjour et merci pour l’astuce 🙂
    Est-il possible de contrôler la précision (nb de chiffres après la virgule) des valeurs des coefficients de la régression ?
    Est-il possible de faire la même chose avec une régression polynômiale ?
    Y ~ a +b X + c X² …
    Merci
    E.

    1. Bonjour,

      pour la précision, je ne pense pas, en tout cas, je n’ai pas trouvé.
      Pour la régression polynomiale, il ya un exemple dans a page d’aide
      # Fit polynomial regression line and add labels
      formula <- y ~ poly(x, 3, raw = TRUE) p <- ggplot(my.data, aes(x, y2, color = group)) + geom_point() + stat_smooth(aes(fill = group, color = group), method = "lm", formula = formula) + stat_regline_equation( aes(label = paste(..eq.label.., ..adj.rr.label.., sep = "~~~~")), formula = formula ) + theme_bw() ggpar(p, palette = "jco")

      Bonne continuatino

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.