Matrice de nuages de points en R : la fonction pairs()

Tracez chaque paire de variables d’un coup, colorez par groupe et ajoutez les corrélations sur les panneaux

Construisez une matrice de nuages de points en R de base avec pairs(). Tracez toutes les paires de variables d’un coup d’œil, choisissez les colonnes à afficher, colorez les points par un facteur de groupe et écrivez des fonctions de panneau personnalisées qui placent corrélations, histogrammes et lissages sur les panneaux inférieurs, supérieurs et diagonaux.

Date de publication

27 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • pairs() dessine une matrice de nuages de points — chaque paire de colonnes numériques, d’un seul coup — sans aucun package.
  • Passez une matrice numérique ou un data.frame ; sélectionnez les colonnes avec data[, 1:4] ou les noms de colonnes pour contrôler quelles paires apparaissent.
  • Dessinez la moitié de la matrice avec upper.panel = NULL (gardez le triangle inférieur) ou lower.panel = NULL (gardez le supérieur).
  • Colorez les points par un groupe avec col = palette[factor], en utilisant une palette adaptée au daltonisme.
  • Remplacez n’importe quel panneau par une fonction personnalisée (upper.panel, lower.panel, diag.panel) pour afficher des corrélations, des histogrammes ou des lissages.

Introduction

Vous avez plusieurs variables numériques et vous voulez voir comment elles se relient — avant d’ajuster quoi que ce soit. Une matrice de nuages de points dessine chaque nuage de points par paire dans une seule grille, vous pouvez donc balayer toutes les corrélations d’un coup d’œil. C’est le premier regard le plus rapide sur un petit jeu de données numérique.

R de base le fait avec une seule fonction : pairs(). Donnez-lui les colonnes que vous voulez et elle dispose une grille n × n — chaque cellule est le nuage de points d’une variable contre une autre, la diagonale étiquette les variables. Cette leçon couvre l’appel de base, la sélection des variables, la coloration des points par groupe, et l’écriture de fonctions de panneau qui placent corrélations, histogrammes et lissages sur des panneaux spécifiques.

Vous préférez la grammaire des graphiques ? GGally::ggpairs() construit la même matrice en ggplot2 — voir la leçon nuage de points ggplot2 pour cet idiome.

Les données

Nous utilisons le jeu de données intégré iris : quatre mesures de fleurs (longueur et largeur des sépales et des pétales) pour 50 fleurs de chacune des trois espèces. Les quatre colonnes numériques sont celles que nous voulons comparer ; la cinquième, Species, est le facteur de regroupement.

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Une matrice de nuages de points de base

Passez les quatre colonnes numériques — iris[, 1:4] écarte le facteur Species — et pairs() dessine les seize panneaux. pch = 19 utilise des points pleins, qui se lisent mieux que le défaut ouvert.

pairs(iris[, 1:4], pch = 19)

A four-by-four base R scatterplot matrix of the iris sepal and petal measurements, every variable plotted against every other with solid black points, the variable names on the diagonal.

Lisez-la comme un tableau : le panneau en ligne i, colonne j trace la variable i (verticale) contre la variable j (horizontale). Les triangles inférieur et supérieur sont des images miroir — les mêmes paires avec les axes échangés — vous n’avez donc jamais besoin de lire qu’une seule moitié.

Sélectionner quelles variables afficher

pairs() trace les colonnes que vous lui passez. Utilisez un indice ou des noms de colonnes pour vous concentrer sur un sous-ensemble — ici juste les deux mesures des pétales contre la longueur des sépales :

pairs(iris[, c("Sepal.Length", "Petal.Length", "Petal.Width")], pch = 19)

A three-by-three base R scatterplot matrix showing sepal length against petal length and petal width, with solid points.

Vous pouvez aussi passer une formule : pairs(~ Sepal.Length + Petal.Length + Petal.Width, data = iris) sélectionne les mêmes colonnes et est pratique quand les données en ont beaucoup plus.

N’afficher qu’un seul triangle

Comme les deux triangles sont redondants, vous ne voulez souvent qu’un seul. Définissez upper.panel = NULL pour garder le triangle inférieur, ou lower.panel = NULL pour garder le supérieur.

pairs(iris[, 1:4], pch = 19, lower.panel = NULL)

A base R scatterplot matrix of the four iris measurements showing only the upper triangle of panels, the lower triangle left blank.

Cela écarte les panneaux dupliqués et laisse plus de place à ce que vous gardez — utile dès que vous commencez à ajouter des corrélations ou des histogrammes du côté vide.

Colorer les points par groupe

Mapper un facteur à la couleur transforme la matrice en une vérification rapide de la séparation des groupes. Définissez une palette adaptée au daltonisme avec une couleur par niveau, puis indexez-la par le facteur : my_cols[iris$Species] donne à chaque point la couleur de son espèce. cex = 0.6 réduit les points pour que les panneaux denses restent lisibles.

my_cols <- c("#3a86d4", "#f4a259", "#5fad56")  # colourblind-safe, one per species

pairs(iris[, 1:4], pch = 19, cex = 0.6,
      col = my_cols[iris$Species],
      lower.panel = NULL)

A base R scatterplot matrix of the four iris measurements with points coloured by species in azure, orange and green, showing clear separation in the petal panels.

Les panneaux des pétales se scindent nettement en trois nuages — la taille des pétales sépare les espèces bien mieux que la taille des sépales. Ce genre de lecture est exactement ce à quoi sert la matrice.

Panneaux personnalisés : corrélations, histogrammes, lissages

Chaque région de la matrice prend sa propre fonction de dessin : lower.panel, upper.panel et diag.panel. Une fonction de panneau reçoit les x et y de cette cellule et dessine dedans. C’est ainsi que vous transformez une matrice ordinaire en la disposition familière « nuage en bas, corrélation en haut, histogramme sur la diagonale ».

Afficher la corrélation sur un panneau

panel.cor calcule la corrélation de Pearson pour la paire et l’écrit au centre de la cellule, en redimensionnant le texte pour que les corrélations plus fortes apparaissent plus grandes. Nous réinitialisons par("usr") à un système de coordonnées 0–1 pour que text() puisse placer l’étiquette par fraction.

my_cols <- c("#3a86d4", "#f4a259", "#5fad56")

# Lower panel: the correlation, text sized by strength
panel.cor <- function(x, y, ...) {
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  r <- round(cor(x, y), 2)
  txt <- paste0("R = ", r)
  cex <- 0.8 / strwidth(txt)
  text(0.5, 0.5, txt, cex = cex * abs(r))
}

# Upper panel: coloured scatter
upper.panel <- function(x, y, ...) {
  points(x, y, pch = 19, cex = 0.6, col = my_cols[iris$Species])
}

pairs(iris[, 1:4],
      lower.panel = panel.cor,
      upper.panel = upper.panel)

A base R scatterplot matrix of the iris measurements with coloured scatter plots in the upper triangle and Pearson correlation values, sized by strength, in the lower triangle.

Les corrélations confirment l’histoire visuelle : la longueur et la largeur des pétales évoluent ensemble presque parfaitement (R = 0.96), tandis que la largeur des sépales suit à peine le reste.

Histogrammes sur la diagonale

La diagonale ne fait habituellement que nommer la variable. Remplacez-la par un histogramme pour voir la distribution de chaque variable dans la même grille. panel.hist dessine des barres mises à l’échelle de la cellule :

my_cols <- c("#3a86d4", "#f4a259", "#5fad56")

panel.hist <- function(x, ...) {
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(usr[1:2], 0, 1.5))
  h <- hist(x, plot = FALSE)
  breaks <- h$breaks; nB <- length(breaks)
  y <- h$counts; y <- y / max(y)
  rect(breaks[-nB], 0, breaks[-1], y, col = "#cfe0f4", border = "white")
}

panel.cor <- function(x, y, ...) {
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  r <- round(cor(x, y), 2)
  text(0.5, 0.5, paste0("R = ", r), cex = 1.1)
}

upper.panel <- function(x, y, ...) {
  points(x, y, pch = 19, cex = 0.6, col = my_cols[iris$Species])
}

pairs(iris[, 1:4],
      lower.panel = panel.cor,
      upper.panel = upper.panel,
      diag.panel  = panel.hist)

A base R scatterplot matrix of the iris measurements with coloured scatter plots, correlation values, and a histogram of each variable down the diagonal.

La longueur et la largeur des pétales sont clairement bimodales — une espèce se place à l’écart des deux autres. C’est la structure de groupe que vous avez vue dans les panneaux colorés, désormais visible sur la diagonale aussi.

Un lissage dans le panneau inférieur

pairs() fournit un panel.smooth prêt à l’emploi qui ajoute une courbe de tendance LOWESS par-dessus les points — utile pour repérer les relations non linéaires. Passez-le à lower.panel :

panel.cor <- function(x, y, ...) {
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  r <- round(cor(x, y), 2)
  text(0.5, 0.5, paste0("R = ", r), cex = 1.1)
}

pairs(iris[, 1:4],
      lower.panel = panel.smooth,
      upper.panel = panel.cor,
      pch = 19, cex = 0.6, col = "#3a86d4")

A base R scatterplot matrix of the iris measurements with red LOWESS smoother lines over the scatter plots in the lower triangle and correlation values in the upper triangle.

Le lissage se courbe là où une relation est courbe et reste droit là où elle est linéaire — un diagnostic rapide avant de vous tourner vers un modèle.

Un seul appel avec le package psych

Écrire des fonctions de panneau est flexible mais verbeux. Le package psych regroupe toute la disposition dans une seule fonction, pairs.panels() : nuages de points sous la diagonale, histogrammes dessus, et la corrélation de Pearson au-dessus — plus des courbes de densité et des ellipses de corrélation optionnelles.

library(psych)

pairs.panels(iris[, 1:4],
             method   = "pearson",  # correlation type
             hist.col = "#3a86d4",
             density  = TRUE,        # density curve over each histogram
             ellipses = TRUE)        # correlation ellipses on the scatters

A psych pairs.panels scatterplot matrix of the four iris measurements: scatter plots with smoothers and correlation ellipses below the diagonal, histograms with density curves on it, and correlation values above.

Avec lm = TRUE elle dessine des droites de régression au lieu de lissages, et un facteur de regroupement passé via bg colore les points. C’est la voie la plus rapide vers une matrice de style publication quand vous n’avez pas besoin de personnaliser chaque panneau à la main.

Deux autres options en un seul appel existent si vous les avez installées : car::scatterplotMatrix() ajoute des boîtes à moustaches ou la densité sur la diagonale et des droites de régression par groupe, et GGally::ggpairs() construit la matrice en ggplot2 (variables continues et catégorielles). Toutes deux suivent la même idée — choisissez celle dont les défauts correspondent à la figure que vous voulez.

Essayez en direct

Modifiez les colonnes, la palette ou les fonctions de panneau et appuyez sur Run — cela s’exécute dans votre navigateur via webR, sans installation.

🟢 Avec un agent IA

Demandez à Prova « comment placer un histogramme sur la diagonale d’un graphique pairs() ? » — elle répond avec du code R de base que vous pouvez exécuter, donc la correction est reproductible. The runtime is the judge. Demander à Prova →

Problèmes courants

pairs() génère une erreur sur les colonnes non numériques. Une matrice de nuages de points a besoin de nombres. Si vous passez un data.frame entier qui inclut une colonne facteur ou caractère (comme iris$Species), sélectionnez d’abord uniquement les colonnes numériques — iris[, 1:4], ou iris[, sapply(iris, is.numeric)] pour garder automatiquement chaque colonne numérique.

Les points sortent tous d’une seule couleur. col colore les points dans l’ordre, donc pour colorer par groupe vous devez indexer une palette par le facteur : col = my_cols[iris$Species], et non col = iris$Species (qui utilise les codes entiers du facteur comme positions dans la palette et se trompe facilement). Définissez une couleur par niveau et indexez-la.

Ma fonction de panneau ne dessine rien ou au mauvais endroit. Les fonctions de panneau dessinent dans le système de coordonnées propre à la cellule. Si vous le réinitialisez avec par(usr = c(0, 1, 0, 1)) pour placer le texte par fraction, restaurez-le toujours avec on.exit(par(usr)) pour que le panneau suivant ne soit pas perturbé.

Questions fréquentes

Utilisez la fonction de base pairs(). Passez une matrice numérique ou les colonnes numériques d’un data frame — pairs(iris[, 1:4]) — et elle dessine chaque nuage de points par paire dans une grille. Aucun package n’est requis.

Ne passez à pairs() que les colonnes que vous voulez, par indice ou par nom : pairs(data[, c("a", "b", "c")]). Vous pouvez aussi utiliser une formule : pairs(~ a + b + c, data = data).

Construisez une palette avec une couleur par niveau de groupe et indexez-la par le facteur : pairs(data[, 1:4], col = my_cols[data$group]). Utilisez my_cols[data$group], et non le facteur lui-même, pour que chaque niveau corresponde à la couleur que vous voulez.

Passez une fonction personnalisée à lower.panel, upper.panel ou diag.panel. Une fonction panel.cor peut text() la corrélation sur un panneau, et une fonction panel.hist peut dessiner un histogramme sur la diagonale. La fonction pairs.panels() du package psych fait les deux en un seul appel.

Définissez upper.panel = NULL pour garder seulement le triangle inférieur, ou lower.panel = NULL pour garder seulement le supérieur. Les deux moitiés sont des images miroir, donc en supprimer une retire les panneaux redondants.

Testez vos connaissances

À partir des colonnes mpg, hp, wt et qsec de mtcars, dessinez une matrice de nuages de points qui affiche les nuages de points dans le triangle supérieur et la corrélation dans le triangle inférieur. Colorez les points d’un seul azur ("#3a86d4").

Définissez panel.cor exactement comme dans la leçon (réinitialisez par("usr") à c(0,1,0,1), puis text() la cor(x, y)). Passez-la comme lower.panel, dessinez les points avec upper.panel ou les arguments pch/col, et c’est tout.

vars <- mtcars[, c("mpg", "hp", "wt", "qsec")]

panel.cor <- function(x, y, ...) {
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  r <- round(cor(x, y), 2)
  text(0.5, 0.5, paste0("R = ", r), cex = 1.2)
}

pairs(vars,
      lower.panel = panel.cor,
      upper.panel = function(x, y) points(x, y, pch = 19, cex = 0.7, col = "#3a86d4"))

La fonction upper.panel dessine le nuage coloré ; panel.cor écrit chaque corrélation dans la cellule inférieure miroir.

Vérification rapide. Vous voulez garder seulement le triangle inférieur d’un graphique pairs(). Quel argument définissez-vous à NULL ?

upper.panel = NULL. Définir upper.panel = NULL efface le triangle supérieur et laisse l’inférieur ; lower.panel = NULL fait l’inverse.

Conclusion

pairs() est la fonction unique de R de base pour une matrice de nuages de points : donnez-lui des colonnes numériques et elle trace chaque paire d’un coup. Sélectionnez les variables avec un indice ou une formule, écartez un triangle redondant avec upper.panel/lower.panel = NULL, colorez les points en indexant une palette avec votre facteur de groupe, et substituez des fonctions de panneau personnalisées pour les corrélations, histogrammes ou lissages. Quand vous voulez tout cela en un seul appel, psych::pairs.panels() l’emballe.

Leçons connexes

Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série R Base Graphics — 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 : chaque figure a été produite par le code affiché, exécuté lors de la génération du site (si elles s’affichent, le code fonctionne), et le bac à sable se réexécute en direct dans votre navigateur. Modifiez n’importe quel bloc et appuyez sur Run. The runtime is the judge.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Matrice de nuages de points en R : la fonction pairs()},
  date = {2026-06-27},
  url = {https://www.datanovia.com/learn/data-visualization/r-base/scatterplot-matrix},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Matrice de nuages de points en R : la fonction pairs().” 2026. June 27. https://www.datanovia.com/learn/data-visualization/r-base/scatterplot-matrix.