Nuage de points avec corrélation en R (ggpubr)

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.
Obtenez le livre — R Graphics Essentials (PDF)

Introduction

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 <- mtcars
df$cyl <- factor(df$cyl)

ggscatter(df, x = "wt", y = "mpg",
          color = "cyl", palette = "jco", shape = "cyl",   # split by cylinders
          add = "reg.line",                                # per-group regression line
          ellipse = TRUE) +                                # concentration ellipses
  stat_cor(aes(color = cyl), label.x = 3)                  # one correlation per group

A ggpubr scatter plot of mtcars weight vs mpg coloured and shaped by number of cylinders, with a regression line and confidence ellipse per group and a Pearson correlation coefficient annotated for each 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înesx et y — et renvoie un ggplot déjà mis en forme auquel vous pouvez continuer d’ajouter des éléments.

library(ggpubr)
df <- mtcars

ggscatter(df, x = "wt", y = "mpg",
          color = "#3a86d4", size = 2)

A ggpubr scatter plot of mtcars weight on the x-axis against miles per gallon on the y-axis, styled with theme_pubr().

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 <- mtcars

ggscatter(df, x = "wt", y = "mpg",
          add = "reg.line",                                  # linear fit
          conf.int = TRUE,                                   # 95% confidence band
          add.params = list(color = "#3a86d4", fill = "lightgray"))

A ggpubr scatter plot of weight vs mpg with a blue linear regression line and a light-grey 95 percent confidence band.

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 <- mtcars

ggscatter(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-value
           label.x = 3, label.y = 32)

A ggpubr scatter plot of weight vs mpg with a regression line, confidence band and a Pearson correlation coefficient with p-value annotated at the top.

Passez au coefficient basé sur les rangs — le rho de Spearman — en passant method = "spearman" :

library(ggpubr)
df <- mtcars

ggscatter(df, x = "wt", y = "mpg",
          add = "reg.line", conf.int = TRUE,
          add.params = list(color = "#3a86d4", fill = "lightgray")) +
  stat_cor(method = "spearman",                              # rank correlation
           label.x = 3, label.y = 32)

A ggpubr scatter plot of weight vs mpg with a regression line and a Spearman rank correlation coefficient annotated at the top.

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 <- mtcars
df$cyl <- factor(df$cyl)

ggscatter(df, x = "wt", y = "mpg",
          color = "cyl", palette = "jco", shape = "cyl",
          add = "reg.line") +                                # one fit per group
  stat_cor(aes(color = cyl), label.x = 3)                    # one correlation per group

A ggpubr scatter plot of weight vs mpg with points coloured and shaped by cylinder count, a separate regression line per group, and a Pearson correlation coefficient for each 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 <- mtcars
df$cyl <- factor(df$cyl)

ggscatter(df, x = "wt", y = "mpg",
          color = "cyl", palette = "jco", shape = "cyl",
          ellipse = TRUE,                                    # draw ellipses
          mean.point = TRUE)                                 # mark each group mean

A ggpubr scatter plot of weight vs mpg coloured by cylinder count with a normal-probability confidence ellipse drawn around each group.

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.

library(ggpubr)
df <- mtcars
df$cyl <- factor(df$cyl)

ggscatter(df, x = "wt", y = "mpg",
          color = "cyl", palette = "jco",
          size = "qsec", alpha = 0.6) +                      # size = continuous var
  scale_size(range = c(2, 12))                               # tune bubble sizes

A ggpubr bubble chart of weight vs mpg coloured by cylinder count, with point size mapped to quarter-mile time and semi-transparent bubbles.

Étiqueter les points

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 <- mtcars
df$cyl <- factor(df$cyl)
df$name <- rownames(df)                                      # column to label by

ggscatter(df, x = "wt", y = "mpg",
          color = "cyl", palette = "jco",
          label = "name", repel = TRUE,                      # repelled labels
          label.select = c("Toyota Corolla", "Merc 280", "Maserati Bora"))

A ggpubr scatter plot of weight vs mpg coloured by cylinder count with three selected cars labelled, the text repelled to avoid overlap.

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

A ggpubr scatter plot of iris sepal length vs sepal width with a marginal histogram of each variable on the top and right axes.

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 boxplots
  margin.params = list(fill = "Species", color = "black", size = 0.2),
  ggtheme = theme_bw())

A ggpubr scatter plot of iris sepal length vs sepal width coloured by species, with a marginal boxplot for each species on the top and right axes.

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

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.

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.

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().

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.

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

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 <- mtcars df$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)
library(ggpubr)
df <- mtcars
df$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().

Leçons connexes

Vous préférez un livre ? R Graphics Essentials est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.

Obtenir le livre (PDF) →Les leçons restent gratuites en ligne.
Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série ggpubr — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

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.

Réutilisation

Citation

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
“Nuage de points avec corrélation en R (ggpubr).” 2026. June 22. https://www.datanovia.com/learn/data-visualization/ggpubr/scatter-correlation.