Nuages de points 3D en R : statique avec scatterplot3d et interactif avec plotly

Représentez trois variables à la fois — un nuage de points 3D statique et un autre interactif que l’on fait pivoter

Data Visualization

Apprenez à créer des nuages de points 3D en R — un graphique statique avec scatterplot3d (points colorés par groupe, un plan de régression ajusté) et une version interactive que l’on fait pivoter avec plotly. Montrez les relations entre trois variables numériques d’un seul coup d’œil, le tout à partir de R en copier-coller.

Auteur·rice
Date de publication

8 juillet 2026

Modifié

17 juillet 2026

AstuceCe que vous apprendrez
  • Dessiner un nuage de points 3D statique avec scatterplot3d — colorer les points par groupe, faire pivoter la vue et superposer un plan de régression.
  • Construire un nuage de points 3D interactif que l’on fait pivoter avec plotly — le faire tourner à la souris, survoler pour afficher les valeurs.
  • Quand utiliser lequel : statique pour un article ou un rapport PDF, interactif pour l’exploration ou une page web.
  • Chaque graphique est rendu à partir de vrai R en copier-coller à l’aide de données intégrées — vous n’avez besoin que de scatterplot3d et plotly.

Un nuage de points plat ne montre que deux variables à la fois. Lorsque vous avez trois variables numériques et que vous voulez voir comment elles sont toutes liées en même temps — disons la longueur des sépales, la largeur des sépales et la longueur des pétales — un nuage de points 3D place chaque observation dans un cube que vous lisez selon trois axes.

R vous propose deux méthodes simples. scatterplot3d dessine une figure statique fixe et prête à publier à l’aide du seul R de base — parfaite pour un article ou un PDF. plotly dessine un widget que l’on fait pivoter à la souris et que l’on survole pour lire les valeurs exactes — parfait pour une page web ou un travail exploratoire. Ce billet couvre les deux, à l’aide des données intégrées iris (150 fleurs de trois espèces) et trees (31 cerisiers noirs).

La méthode statique : scatterplot3d

scatterplot3d ne nécessite qu’une version installée de R. Installez-le une fois :

install.packages("scatterplot3d")

Passez à scatterplot3d() un data frame ou une matrice dont les trois premières colonnes sont les coordonnées x, y et z (ou une formule z ~ x + y) et il dessine le nuage avec des valeurs par défaut sensées. pch = 16 donne des points pleins et angle fait pivoter la vue autour de l’axe vertical — pratique quand des points se cachent les uns derrière les autres :

library(scatterplot3d)
data(iris)

scatterplot3d(iris[, 1:3], pch = 16, color = "#3a86d4", angle = 55)

A basic 3D scatter plot of the first three iris measurements drawn with scatterplot3d, uniform azure dots viewed at a 55-degree angle.

iris[, 1:3] fournit les trois coordonnées — Sepal.Length (x), Sepal.Width (y) et Petal.Length (z) — color = "#3a86d4" est l’azur de la marque, et angle = 55 incline la vue pour que la structure se sépare. Définissez le titre et les étiquettes d’axes exactement comme dans le plot() de R de base avec main, xlab, ylab et zlab.

Colorer les points par groupe (avec une légende)

Pour distinguer les trois espèces, construisez un vecteur de couleurs par point en indexant une palette avec le facteur de regroupement. as.numeric(iris$Species) transforme le facteur en 1, 2, 3, et indexer un vecteur de trois couleurs avec lui attribue à chaque fleur la couleur de son espèce. Capturez le graphique dans s3d pour pouvoir placer une légende avec xyz.convert(), qui convertit un point de l’espace des données en coordonnées d’écran que legend() attend :

library(scatterplot3d)
data(iris)

# One colourblind-safe colour per species
colors <- c("#3a86d4", "#E69F00", "#56B4E9")
point_cols <- colors[as.numeric(iris$Species)]

s3d <- scatterplot3d(iris[, 1:3], pch = 16, color = point_cols, angle = 55)
legend(s3d$xyz.convert(7.5, 3, 4.5),
       legend = levels(iris$Species),
       col = colors, pch = 16, bty = "n")

A 3D scatter plot of the iris data with each species in a different colourblind-safe colour and a legend mapping colour to species.

La palette (azur de la marque + deux couleurs Okabe–Ito) est adaptée au daltonisme. Attention au piège : color a besoin d’une valeur par point, pas d’une par groupe — passer les trois couleurs directement les recycle dans l’ordre des lignes plutôt que par espèce.

Ajouter des lignes de projection pour lire la profondeur

La profondeur est difficile à juger sur une page plane. L’argument type = "h" dessine une « ligne de projection » verticale de chaque point jusqu’au sol, fixant sa position x–y pour que la hauteur (z) devienne lisible :

library(scatterplot3d)
data(iris)

colors <- c("#3a86d4", "#E69F00", "#56B4E9")
point_cols <- colors[as.numeric(iris$Species)]

scatterplot3d(iris[, 1:3], pch = 16, type = "h", color = point_cols, angle = 55)

A 3D scatter plot of the iris data with a vertical drop line from each point to the floor grid, coloured by species.

type = "h" est le seul changement qui ajoute les tiges — le moyen le plus efficace de rendre lisible un nuage 3D statique quand on ne peut pas le faire pivoter pour juger la profondeur.

Superposer un plan de régression

scatterplot3d() renvoie une liste de fonctions utilitaires pour compléter un graphique existant. La plus utile est plane3d(), qui dessine le plan d’un modèle linéaire lm(z ~ x + y) — l’analogue 3D d’une droite de régression. Ici, nous modélisons le volume de l’arbre à partir de sa circonférence et de sa hauteur à l’aide des données intégrées trees :

library(scatterplot3d)
data(trees)

# 1. Draw the cloud and capture the returned helper object
s3d <- scatterplot3d(trees, type = "h", color = "#3a86d4",
                     angle = 55, pch = 16)

# 2. Fit volume ~ girth + height and draw its plane
model <- lm(Volume ~ Girth + Height, data = trees)
s3d$plane3d(model)

A 3D scatter plot of the trees data with vertical drop lines and a fitted regression plane showing volume as a function of girth and height.

Le schéma est le suivant : affectez le graphique à s3d, ajustez le modèle avec lm(), puis appelez s3d$plane3d(model) pour superposer la surface ajustée. Les points au-dessus du plan sont sous-estimés, ceux en dessous surestimés. Si le plan n’apparaît pas, c’est presque toujours parce que plane3d() a été appelé seul — c’est une méthode de l’objet renvoyé, vous devez donc d’abord capturer s3d.

A static 3D scatter plot of the iris data drawn with scatterplot3d in R, points coloured by species with a legend, viewed at a 55-degree angle.

La méthode interactive : plotly

Quand vous voulez faire tourner le nuage à la souris et survoler pour lire les valeurs exactes, utilisez plotly. Sa trace scatter3d produit un widget WebGL que l’on fait pivoter et qui s’intègre directement dans une page web (celui-ci est actif — glissez pour pivoter, défilez pour zoomer).

Nous reprenons la même idée qu’avant, mais plotly se charge de la coloration par groupe pour vous : passez les variables brutes avec la syntaxe de formule ~ et laissez color = ~Species répartir les points, colors fournissant la palette :

library(plotly)
data(iris)

plot_ly(
  iris,
  x = ~Sepal.Length, y = ~Sepal.Width, z = ~Petal.Length,
  color = ~Species,
  colors = c("#3a86d4", "#E69F00", "#56B4E9"),
  type = "scatter3d", mode = "markers",
  marker = list(size = 4)
) |>
  layout(scene = list(
    xaxis = list(title = "Sepal Length"),
    yaxis = list(title = "Sepal Width"),
    zaxis = list(title = "Petal Length")
  ))

Le graphique interactif ci-dessus montre les 150 fleurs d’iris sous forme de points en trois dimensions — longueur des sépales, largeur des sépales et longueur des pétales — colorés par espèce, les trois espèces formant des nuages distincts. type = "scatter3d" avec mode = "markers" dessine les points en 3D ; color = ~Species les colore par groupe et construit la légende automatiquement ; marker = list(size = 4) garde les points nets. La disposition scene définit les trois titres d’axes. Glissez pour pivoter, défilez pour zoomer, et survolez n’importe quel point pour lire ses coordonnées — aucun nouveau rendu nécessaire.

Lequel choisir ?

  • Optez pour scatterplot3d quand la figure atterrit dans un article, un PDF ou un rapport imprimé — c’est une image fixe et prête à publier, et type = "h" plus un angle bien choisi rendent la profondeur lisible sur une page plane. Il dessine aussi un vrai plan de régression, ce que plotly ne fait pas d’emblée.
  • Optez pour plotly quand le graphique vit sur une page web ou que vous êtes en phase d’exploration — faire pivoter le nuage vous-même est le moyen le plus rapide de voir si les groupes se séparent vraiment en 3D.
  • Une note sur rgl : c’est une autre option 3D classique, mais elle effectue son rendu via OpenGL, ce qui est peu commode en contexte sans affichage/CI ou web. Pour un graphique interactif adapté au web, plotly est le choix moderne.

Questions fréquentes

Pour un graphique statique, installez et chargez scatterplot3d, puis appelez scatterplot3d(data[, 1:3]) avec une matrice ou un data frame dont les trois colonnes sont les coordonnées x, y et z (ou utilisez la syntaxe de formule scatterplot3d(z ~ x + y)). Pour un graphique interactif, utilisez plotly::plot_ly(data, x = ~x, y = ~y, z = ~z, type = "scatter3d", mode = "markers").

Utilisez plotly avec une trace scatter3d : plot_ly(iris, x = ~Sepal.Length, y = ~Sepal.Width, z = ~Petal.Length, color = ~Species, type = "scatter3d", mode = "markers"). Il produit un widget WebGL que vous pouvez faire glisser pour pivoter, défiler pour zoomer et survoler pour afficher les valeurs — et il s’intègre directement dans une page HTML.

Dans scatterplot3d, construisez un vecteur par point en indexant une palette avec le facteur de regroupement : cols <- c("#3a86d4", "#E69F00", "#56B4E9")[as.numeric(df$group)], puis passez color = cols. Dans plotly, c’est plus simple — mappez simplement color = ~group et donnez une palette colors ; plotly répartit les points et construit la légende pour vous.

Utilisez scatterplot3d : capturez le graphique avec s3d <- scatterplot3d(...), ajustez un modèle avec lm(z ~ x + y), puis superposez son plan avec s3d$plane3d(model). Si rien n’apparaît, vous avez presque certainement appelé plane3d() seul — c’est une méthode de l’objet renvoyé, vous devez donc d’abord affecter s3d.

Utilisez scatterplot3d pour une figure statique et prête à publier (et pour les plans de régression), et plotly pour un graphique interactif que l’on fait pivoter et que l’on peut intégrer dans une page web. rgl est un classique performant mais effectue son rendu via OpenGL, ce qui est peu commode en contexte sans affichage/CI ou web — plotly est la voie interactive moderne.

Pour aller plus loin dans /learn

Ce billet est la recette ciblée. Pour la présentation complète, pas à pas, de la méthode statique — chaque argument de scatterplot3d, les options de boîte et de grille, les points supplémentaires, et un exercice pratique — voir la leçon :

Voir aussi

🟢 Avec un agent IA

Demandez à Prova « transformez mes données à trois colonnes en un nuage de points 3D plotly interactif coloré par groupe » — elle répond avec du code que vous pouvez exécuter sur vos propres données. The runtime is the judge. Demander à Prova →

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

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

Citation

BibTeX
@online{kassambara2026,
  author = {Kassambara, Alboukadel},
  title = {Nuages de points 3D en R : statique avec scatterplot3d et
    interactif avec plotly},
  date = {2026-07-08},
  url = {https://www.datanovia.com/blog/3d-scatter-plot-in-r},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
Kassambara, Alboukadel. 2026. “Nuages de points 3D en R : statique avec scatterplot3d et interactif avec plotly.” July 8. https://www.datanovia.com/blog/3d-scatter-plot-in-r.