library(scatterplot3d)
data(iris)
scatterplot3d(iris[, 1:3], pch = 16, color = "#3a86d4", angle = 55)
Représentez trois variables à la fois — un nuage de points 3D statique et un autre interactif que l’on fait pivoter
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.
scatterplot3d — colorer les points par groupe, faire pivoter la vue et superposer un plan de régression.plotly — le faire tourner à la souris, survoler pour afficher les valeurs.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).
scatterplot3d ne nécessite qu’une version installée de R. Installez-le une fois :
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 :

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.
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")
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.
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 :

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.
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 :

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.

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.
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.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.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.
/learnCe 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 :
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 →
@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}
}