Ajoutez une droite de régression, le coefficient de corrélation et des graphiques marginaux en un seul appel — en direct dans votre navigateur
Apprenez à construire des nuages de points prêts à publier en R avec ggpubr. Utilisez ggscatter() pour ajouter une droite de régression et un intervalle de confiance, stat_cor() pour afficher le coefficient de corrélation de Pearson ou de Spearman, colorez et donnez une forme par groupe avec un ajustement par groupe et des ellipses de confiance, dessinez un graphique à bulles, étiquetez les points et ajoutez des histogrammes, des boîtes à moustaches ou des densités marginaux avec ggscatterhist(). Modifiez et exécutez chaque exemple en direct.
Date de publication
22 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
ggscatter() dessine le nuage de points ; add = "reg.line" + conf.int = TRUE superposent une droite de régression et sa bande de confiance.
stat_cor() affiche le coefficient de corrélation (et sa p-value) directement sur le graphique — method = "pearson" (par défaut) ou "spearman" ; placez-le avec label.x / label.y.
Colorez, donnez une forme et une taille par groupe (color =, shape =, size =) : vous obtenez un ajustement et une corrélation par groupe, plus d’éventuelles ellipses de confiance (ellipse = TRUE).
Associez une variable continue à size pour un graphique à bulles ; passez label = + repel = TRUE pour annoter les points sans chevauchement.
ggscatterhist() attache des histogrammes, des boîtes à moustaches ou des densités marginaux au nuage de points — par groupe, en un seul appel.
Chaque graphique ci-dessous est affiché pour vous — modifiez ensuite n’importe quel exemple en direct dans le bac à sable.
Un nuage de points répond à une question — comment deux variables évoluent-elles ensemble ? — mais un relecteur de revue en pose toujours deux autres : quelle est la tendance, et quelle est sa force ? En R, le paquet ggpubr répond aux trois en un seul appel. ggscatter() dessine les points, add = "reg.line" ajuste la tendance, et stat_cor() affiche le coefficient de corrélation précisément là où vous en avez besoin — sans lm() manuel, sans copier-coller de cor.test(), sans tâtonner avec les coordonnées de geom_text().
Cette leçon parcourt l’ensemble du flux de travail canonique sur les données intégrées mtcars et iris : un ggscatter() de base, l’ajout de la droite de régression et de l’intervalle de confiance, l’annotation de la corrélation de Pearson et de Spearman avec stat_cor(), puis la coloration par groupe pour obtenir un ajustement par groupe et des ellipses de confiance, un graphique à bulles, des points étiquetés, et enfin des graphiques marginaux avec ggscatterhist(). Chaque figure est affichée ici même, et vous pouvez réexécuter ou modifier chacune d’elles en direct.
ggpubr applique automatiquement son propre thème de publication (theme_pubr()) à l’intérieur de ggscatter(), de sorte que les graphiques sont prêts pour une revue dès le départ — vous n’ajoutez pas de thème.
Le graphique canonique : ajustement par groupe, ellipses & corrélation
Voici l’image que la plupart des gens viennent chercher : le poids face à la consommation de carburant, coloré par le nombre de cylindres, avec une droite de régression et un coefficient de corrélation de Pearson par groupe, et une ellipse de confiance autour de chaque nuage. color/shape séparent les groupes, add = "reg.line" ajuste chacun d’eux, ellipse = TRUE dessine l’ellipse de concentration, et stat_cor(aes(color = cyl)) affiche un coefficient par couleur. Tout le reste de la leçon est une variation de ce seul appel.
library(ggpubr)df <- mtcarsdf$cyl <-factor(df$cyl)ggscatter(df, x ="wt", y ="mpg",color ="cyl", palette ="jco", shape ="cyl", # split by cylindersadd ="reg.line", # per-group regression lineellipse =TRUE) +# concentration ellipsesstat_cor(aes(color = cyl), label.x =3) # one correlation per group
Nous y arriverons progressivement. D’abord, le cas le plus simple : un seul nuage de points.
Un nuage de points de base
Commencez par la relation brute : le poids de la voiture (wt) face aux miles par gallon (mpg). ggscatter() prend le data frame et les noms de colonnes sous forme de chaînes — x et y — et renvoie un ggplot déjà mis en forme auquel vous pouvez continuer d’ajouter des éléments.
library(ggpubr)df <- mtcarsggscatter(df, x ="wt", y ="mpg",color ="#3a86d4", size =2)
Voilà le graphique. Les deux sections suivantes ajoutent les deux choses pour lesquelles un nuage de points est vraiment fait : la tendance et sa force.
Ajouter une droite de régression et un intervalle de confiance
Définissez add = "reg.line" pour superposer l’ajustement linéaire, et conf.int = TRUE pour ombrer sa bande de confiance à 95 %. Stylisez la droite et la bande via add.params (une liste de color, fill, …).
library(ggpubr)df <- mtcarsggscatter(df, x ="wt", y ="mpg",add ="reg.line", # linear fitconf.int =TRUE, # 95% confidence bandadd.params =list(color ="#3a86d4", fill ="lightgray"))
add = "loess" remplace la droite par un ajustement local lissé — pratique lorsque la relation est nettement courbe.
Ajouter le coefficient de corrélation avec stat_cor()
La courbe de tendance montre la direction ; le coefficient de corrélation montre la force. Ajoutez stat_cor() et ggpubr affiche R et sa p-value sur le graphique. Choisissez la méthode avec method = "pearson" (linéaire, par défaut) ou "spearman" (basée sur les rangs, robuste aux valeurs aberrantes et aux tendances monotones mais courbes), et positionnez l’étiquette en unités de données avec label.x / label.y.
library(ggpubr)df <- mtcarsggscatter(df, x ="wt", y ="mpg",add ="reg.line", conf.int =TRUE,add.params =list(color ="#3a86d4", fill ="lightgray")) +stat_cor(method ="pearson", # Pearson R + p-valuelabel.x =3, label.y =32)
Passez au coefficient basé sur les rangs — le rho de Spearman — en passant method = "spearman" :
library(ggpubr)df <- mtcarsggscatter(df, x ="wt", y ="mpg",add ="reg.line", conf.int =TRUE,add.params =list(color ="#3a86d4", fill ="lightgray")) +stat_cor(method ="spearman", # rank correlationlabel.x =3, label.y =32)
Quel coefficient ? Pearson mesure l’association linéaire sur des données à peu près normales ; Spearman mesure toute tendance monotone et ignore les valeurs aberrantes. Les choisir et les interpréter est une question de statistique — voir la série de statistiques à venir.
Couleur, forme et un ajustement par groupe
Associez une variable de regroupement à color (et shape pour garder la lisibilité à l’impression) et ggpubr ajuste et corrèle chaque groupe séparément. Passez le même regroupement à stat_cor() via aes(color = ...) pour obtenir un coefficient par couleur. Ici, le poids vs mpg séparé par le nombre de cylindres.
library(ggpubr)df <- mtcarsdf$cyl <-factor(df$cyl)ggscatter(df, x ="wt", y ="mpg",color ="cyl", palette ="jco", shape ="cyl",add ="reg.line") +# one fit per groupstat_cor(aes(color = cyl), label.x =3) # one correlation per group
Ajouter des ellipses de concentration
Une ellipse de confiance résume où se concentrent les points de chaque groupe — une façon nette de montrer la séparation. Ajoutez ellipse = TRUE ; ajustez la couverture avec ellipse.level (par défaut 0.95) et la forme avec ellipse.type ("norm", "t", "convex", "confidence").
library(ggpubr)df <- mtcarsdf$cyl <-factor(df$cyl)ggscatter(df, x ="wt", y ="mpg",color ="cyl", palette ="jco", shape ="cyl",ellipse =TRUE, # draw ellipsesmean.point =TRUE) # mark each group mean
Graphique à bulles : associer une variable continue à la taille
Associez une variable continue à size et le nuage de points devient un graphique à bulles — une troisième dimension encodée par l’aire des points. Ici, le poids vs mpg, avec la taille des bulles montrant le temps au quart de mile (qsec) ; alpha rend les bulles qui se chevauchent lisibles et scale_size() définit la plage de tailles.
Pour mettre en avant des observations individuelles, passez le nom d’une colonne d’étiquettes à label et définissez repel = TRUE pour que le texte s’écarte au lieu de se chevaucher. Utilisez label.select pour n’annoter que les points qui valent la peine d’être nommés — ici une poignée de voitures par nom de ligne.
library(ggpubr)df <- mtcarsdf$cyl <-factor(df$cyl)df$name <-rownames(df) # column to label byggscatter(df, x ="wt", y ="mpg",color ="cyl", palette ="jco",label ="name", repel =TRUE, # repelled labelslabel.select =c("Toyota Corolla", "Merc 280", "Maserati Bora"))
Graphiques marginaux avec ggscatterhist()
Un nuage de points montre la distribution conjointe ; les distributions marginales de x et y apportent beaucoup gratuitement. ggscatterhist() dessine le nuage de points avec un graphique marginal sur chaque axe en un seul appel — sans tuyauterie cowplot. La marge par défaut est un histogramme ; changez-la avec margin.plot ("density", "boxplot"). Ici, la longueur des sépales d’iris vs la largeur avec des histogrammes marginaux.
library(ggpubr)ggscatterhist(iris, x ="Sepal.Length", y ="Sepal.Width",color ="#3a86d4",margin.params =list(fill ="lightgray")) # marginal histograms
Passez une variable de regroupement à color et le nuage de points et les marges se séparent par groupe. Définissez margin.plot = "boxplot" pour une boîte à moustaches marginale par groupe — une façon compacte de comparer les distributions.
library(ggpubr)ggscatterhist( iris, x ="Sepal.Length", y ="Sepal.Width",color ="Species", size =3, alpha =0.6,palette ="jco",margin.plot ="boxplot", # marginal boxplotsmargin.params =list(fill ="Species", color ="black", size =0.2),ggtheme =theme_bw())
Remplacez par margin.plot = "density" pour des densités marginales lissées — même appel, une vue de la forme de la distribution.
Essayez en direct
Les graphiques ci-dessus ont été affichés au moment de la construction. Envie d’expérimenter ? Modifiez le code et appuyez sur Run — il s’exécute dans votre navigateur via webR (pas de serveur, pas d’installation). Essayez de passer à method = "spearman", d’ajouter ellipse = TRUE, ou d’associer size = "qsec" pour un graphique à bulles.
Vous travaillez avec ggplot2 de base ? Voir la leçon nuage de points en ggplot2 pour la voie geom_point() + geom_smooth().
🟢 Avec un agent IA
Demandez à Prova« devrais-je rapporter la corrélation de Pearson ou de Spearman pour mes deux colonnes ? » — elle répond avec du code que vous pouvez exécuter sur votre propre data frame, vérifie les hypothèses de linéarité et de valeurs aberrantes, et montre l’appel stat_cor() correspondant, de sorte que le choix soit reproductible. The runtime is the judge.Demander à Prova →
Problèmes courants
stat_cor() affiche un coefficient, et non un par groupe. Vous avez coloré les points mais n’avez pas passé le groupe à la couche statistique — ajoutez stat_cor(aes(color = <group>)) pour qu’elle hérite du regroupement.
La droite de régression est absente.add = "reg.line" est un argument chaîne de ggscatter(), et non une couche + geom_smooth() distincte ; vérifiez l’orthographe et qu’elle se trouve à l’intérieur de l’appel ggscatter().
L’étiquette de corrélation se trouve hors écran ou sur des points. Positionnez-la explicitement avec label.x / label.y en unités de données (la même échelle que vos axes).
Les étiquettes de points se chevauchent en un fouillis illisible. Ajoutez repel = TRUE, et utilisez label.select (un vecteur de noms ou une expression criteria) pour n’étiqueter que les points qui comptent.
ggscatterhist() ignore + theme(...) ajouté ensuite. Il renvoie un objet composite, et non un seul ggplot — stylisez-le via ses propres arguments (ggtheme =, margin.params =) au lieu d’ajouter des couches.
Questions fréquentes
NoteComment créer un nuage de points en R avec ggpubr ?
Utilisez ggscatter() : ggscatter(mtcars, x = "wt", y = "mpg") dessine un nuage de points prêt à publier. Ajoutez une droite de régression et sa bande avec add = "reg.line", conf.int = TRUE, colorez par groupe avec color = "cyl", et associez une variable continue à la taille des points (size = "hp") pour un graphique à bulles — le tout comme arguments du même appel.
NoteComment ajouter un coefficient de corrélation à un nuage de points ?
Ajoutez la couche stat_cor() : ggscatter(mtcars, x = "wt", y = "mpg", add = "reg.line") + stat_cor(). Elle affiche le R et la p-value sur le graphique. Utilisez stat_cor(method = "spearman") pour une corrélation de rang, et stat_cor(aes(color = group)) pour obtenir un coefficient par groupe coloré plutôt qu’un seul coefficient global.
NotePourquoi stat_cor() affiche-t-il un seul R au lieu d’un par groupe ?
Parce que l’esthétique de couleur a été définie sur les points mais pas héritée par la couche statistique. Transmettez le groupe explicitement : stat_cor(aes(color = cyl)). ggpubr calcule et affiche alors une corrélation distincte pour chaque groupe — en accord avec les droites de régression par groupe obtenues via color = "cyl" dans ggscatter().
NoteComment n’étiqueter que certains points sans que les étiquettes se chevauchent ?
Définissez label = "<colonne de noms>" et repel = TRUE pour que les étiquettes s’écartent au lieu de s’empiler. Pour n’étiqueter que les points qui comptent, utilisez label.select — soit un vecteur de noms, soit une expression criteria (par exemple label.select = list(criteria = "y > 25")). Étiqueter chaque point d’un graphique dense devient illisible ; sélectionnez délibérément.
NotePourquoi ggscatterhist() ne se restylise-t-il pas avec + theme() ?
ggscatterhist() renvoie un objet composite (un panneau principal plus des graphiques marginaux), et non un seul ggplot ; les couches + theme(...) / + geom_* ajoutées ensuite sont donc ignorées. Stylisez-le plutôt via ses propres arguments — ggtheme = pour le panneau principal et margin.params = list(...) pour les histogrammes/densités marginaux.
Testez vos connaissances
ImportantExercice : un nuage de points par groupe avec corrélation par groupe
Complétez le code pour que les points soient colorés par cyl, que chaque groupe reçoive sa propre droite de régression, et qu’un coefficient de corrélation de Spearman soit affiché par groupe.
# stat_cor() needs the group in its aes() and the method set:# aes(color = cyl), method = "spearman", label.x = 3
library(ggpubr)df <- mtcarsdf$cyl <-factor(df$cyl)ggscatter(df, x ="wt", y ="mpg",color ="cyl", palette ="jco",add ="reg.line") +stat_cor(aes(color = cyl), method ="spearman", label.x =3)
Conclusion
Vous avez construit le nuage de points prêt à publier de la manière canonique : ggscatter() pour les points, add = "reg.line" + conf.int = TRUE pour la tendance, et stat_cor() pour le coefficient de corrélation (Pearson ou Spearman). À partir de là, vous avez séparé par groupe pour un ajustement par groupe et des ellipses de confiance, associé une variable continue à size pour un graphique à bulles, étiqueté les points avec repel = TRUE, et attaché des histogrammes, des boîtes à moustaches ou des densités marginaux avec ggscatterhist() — le tout sans quitter le theme_pubr() de ggpubr.
Pour choisir et interpréter la corrélation elle-même (Pearson vs Spearman, hypothèses, significativité, taille d’effet), voir la série de statistiques à venir — ggpubr est le pont qui place le résultat sur le graphique. Pour le nuage de points en ggplot2 de plus bas niveau, construisez le même graphique à partir de geom_point() + geom_smooth().
Cette leçon est reproductible : les figures sont exécutées au moment de la construction (si elles s’affichent, le code fonctionne), et le bac à sable et le quiz se réexécutent en direct dans votre navigateur. The runtime is the judge.
@online{2026,
author = {},
title = {Nuage de points avec corrélation en R (ggpubr)},
date = {2026-06-22},
url = {https://www.datanovia.com/learn/data-visualization/ggpubr/scatter-correlation},
langid = {fr}
}