Graphiques 3D et 4D en R avec le package plot3D
scatter3D, hist3D statiques et prêts à publier, avec une 4ᵉ dimension en couleur
Un guide pratique du package plot3D en R — tracez des nuages de points 3D statiques, des histogrammes 3D, des plans de régression et des flèches, plus le fameux graphique « 4D » qui associe une quatrième variable à la couleur avec une légende. Chaque recette associe du code R prêt à copier à sa figure rendue.
- Tracez des nuages de points 3D statiques avec
scatter3D()— colorez selon une variable, changez la boîte, la palette et l’angle de vue. - Ajoutez une véritable quatrième dimension : associez une variable supplémentaire à la couleur (
colvar) avec une légende de couleur — ce quescatterplot3detrglne font pas facilement. - Construisez des histogrammes 3D (
hist3D), des plans de régression, des graphiques de lignes, des intervalles de confiance et des flèches 3D. - Chaque figure est produite à partir de vrai code R prêt à copier. Le code est la recette ; l’image associée est le résultat.
plot3Dest une boîte à outils statique — copiez n’importe quel bloc et exécutez-le en local pour reproduire les graphiques.
Un nuage de points plat montre deux variables. Un nuage de points 3D en montre trois. Mais les données réelles ont souvent une quatrième chose que l’on veut voir en même temps — un groupe, un score, une profondeur. Le package plot3D de Karline Soetaert est conçu exactement pour cela : il dessine des graphiques 3D statiques et prêts à publier et vous permet d’associer une variable supplémentaire à la couleur avec une légende, ce qui vous donne un graphique « 4D » (x, y, z, couleur) que les packages 3D classiques peinent à produire.
plot3D est le cousin statique plus riche de scatterplot3d. Si vous avez seulement besoin d’un nuage statique rapide ou d’un nuage interactif que l’on peut faire pivoter, consultez notre article complémentaire Nuages de points 3D en R avec scatterplot3d et plotly. Optez pour plot3D lorsque vous voulez la boîte à outils statique complète — nuages 4D colorés, histogrammes 3D, surfaces de régression et un contrôle fin de la boîte, de la palette et de la vue.
Installer et charger plot3D
Installez-le une fois, puis chargez-le à chaque session :
install.packages("plot3D")
library("plot3D")Les données
Les exemples utilisent le jeu de données iris intégré à R (150 fleurs de trois espèces : setosa, versicolor, virginica), en prenant trois mesures comme coordonnées x, y et z :
data(iris)
# x, y and z coordinates
x <- iris$Sepal.Length
y <- iris$Petal.Length
z <- iris$Sepal.WidthNuage de points 3D de base
scatter3D(x, y, z) est la fonction de référence. Par défaut, elle colore les points selon la variable z et dessine une légende de couleur correspondante — l’argument clab définit le titre de la légende :
scatter3D(x, y, z, clab = c("Sepal", "Width (cm)"))
Pour désactiver la coloration automatique et dessiner des points uniformes, définissez colvar = NULL et choisissez une seule couleur. pch change la forme des points et cex leur taille :
scatter3D(x, y, z, colvar = NULL, col = "blue",
pch = 19, cex = 0.5)
Modifier la boîte autour du graphique
L’argument bty (« box type », type de boîte) contrôle le cadre. Les valeurs les plus utiles sont "f" (boîte complète), "b" (par défaut — panneaux arrière uniquement), "b2" (panneaux arrière et lignes de la grille) et "g" (fond gris avec lignes de grille blanches). Utilisez colkey = FALSE pour supprimer la légende :
# full box (left) vs back panels + grid lines (right)
scatter3D(x, y, z, bty = "f", colkey = FALSE, main = "bty = 'f'")
scatter3D(x, y, z, bty = "b2", colkey = FALSE, main = "bty = 'b2'")
"g" donne l’allure épurée à panneau gris que l’on voit dans la plupart des figures ci-dessous ; "u" vous laisse définir à la main les couleurs des panneaux et de la grille (col.panel, col.grid).
Palettes de couleurs
plot3D fournit plusieurs générateurs de palettes pour l’argument col : jet.col() (l’arc-en-ciel de style matlab par défaut), gg.col() (des couleurs à la manière de ggplot2) et ramp.col(), qui interpole un schéma personnalisé entre des couleurs que vous nommez :
# ggplot2-like colours (left) vs a custom blue-yellow-red ramp (right)
scatter3D(x, y, z, bty = "g", pch = 18, col = gg.col(100))
scatter3D(x, y, z, bty = "g", pch = 18,
col = ramp.col(c("blue", "yellow", "red")))
ramp.col(c("blue", "yellow", "red")) est le moyen le plus rapide d’obtenir un schéma séquentiel pertinent pour la variable de couleur.
Colorer par groupe (4ᵉ dimension catégorielle)
Pour colorer les points selon une catégorie plutôt que selon un z continu, désactivez la coloration automatique (colvar = NULL) et passez à col un vecteur qui contient déjà une couleur par point — indexez une palette avec les codes entiers de votre facteur. Dessinez ensuite vous-même une legend() discrète simple, car une catégorie n’a pas d’échelle de couleur continue :
scatter3D(iris$Sepal.Length, iris$Petal.Length, iris$Sepal.Width,
bty = "g", pch = 18, colvar = NULL,
col = c("#1B9E77", "#D95F02", "#7570B3")[as.integer(iris$Species)],
colkey = FALSE, ticktype = "detailed",
main = "Iris species", xlab = "Sepal.Length",
ylab = "Petal.Length", zlab = "Sepal.Width")
legend("right", legend = levels(iris$Species),
col = c("#1B9E77", "#D95F02", "#7570B3"),
pch = 18, inset = 0.02, bty = "n")
Il s’agit d’une 4ᵉ dimension catégorielle : les trois axes portent les mesures et la couleur porte l’espèce. La palette Dark2 adaptée au daltonisme (#1B9E77, #D95F02, #7570B3) garde les groupes distincts.
Changer la direction de vue
Deux points cachés derrière deux autres, c’est le problème récurrent de la 3D. Les arguments theta (azimut) et phi (co-latitude) font pivoter la caméra — tous deux valent 40 par défaut. Réduisez phi pour regarder le nuage plus de côté :
scatter3D(x, y, z, theta = 15, phi = 20)
scatter3D(x, y, z, phi = 0, bty = "g")
Essayez quelques angles — un bon couple theta/phi fait plus pour la lisibilité que n’importe quel autre argument.
Titres, étiquettes d’axes et graduations
Définissez le titre et les étiquettes d’axes exactement comme en R de base, avec main, xlab, ylab, zlab :
scatter3D(x, y, z, pch = 18, theta = 20, phi = 20,
main = "Iris data", xlab = "Sepal.Length",
ylab = "Petal.Length", zlab = "Sepal.Width")
Pour des graduations numériques lisibles, définissez ticktype = "detailed" (l’alternative, "simple", ne dessine qu’une flèche de direction) :
scatter3D(x, y, z, phi = 0, bty = "g",
pch = 20, cex = 2, ticktype = "detailed")
Graphiques de lignes
scatter3D() ne se limite pas aux points. L’argument type change la géométrie : "l" pour des lignes, "b" pour à la fois des points et des lignes, et "h" pour des lignes verticales descendant de chaque point jusqu’au plancher :
# lines only
scatter3D(x, y, z, phi = 0, bty = "g", type = "l",
ticktype = "detailed", lwd = 4)
type = "h" (lignes de projection) est particulièrement pratique : les tiges verticales fixent la position x–y de chaque point, si bien que sa hauteur devient lisible sur une page plate.
Ajouter des intervalles de confiance
Passez à CI une liste de matrices à 2 colonnes (intervalles gauche/droite par axe) pour dessiner des barres d’erreur en 3D. Ici, chaque point reçoit un intervalle symétrique de ±0,1 sur l’axe z :
CI <- list(z = matrix(nrow = length(x),
data = rep(0.1, 2 * length(x))))
scatter3D(x, y, z, phi = 0, bty = "g", col = gg.col(100),
pch = 18, CI = CI)
Nuage enrichi avec projections sur le plan basal
Une petite fonction utilitaire — scatter3D_fancy() — projette chaque point sous forme de point estompé sur les panneaux arrière et du plancher à l’aide de panel.first et trans3D(), ce qui rend l’ombre du nuage lisible. C’est la figure utilisée comme couverture de cet article :
# Small dots on the basal and depth planes
scatter3D_fancy <- function(x, y, z, ..., colvar = z) {
panelfirst <- function(pmat) {
XY <- trans3D(x, y, z = rep(min(z), length(z)), pmat = pmat)
scatter2D(XY$x, XY$y, colvar = colvar, pch = ".",
cex = 2, add = TRUE, colkey = FALSE)
XY <- trans3D(x = rep(min(x), length(x)), y, z, pmat = pmat)
scatter2D(XY$x, XY$y, colvar = colvar, pch = ".",
cex = 2, add = TRUE, colkey = FALSE)
}
scatter3D(x, y, z, ..., colvar = colvar, panel.first = panelfirst,
colkey = list(length = 0.5, width = 0.5, cex.clab = 0.75))
}
# colvar maps a genuine 4th variable (Petal.Width) to colour
scatter3D_fancy(x, y, z, pch = 16, colvar = iris$Petal.Width,
ticktype = "detailed", theta = 15, d = 2,
main = "Iris data", clab = c("Petal.Width", "(cm)"))Ici, les trois axes portent Sepal.Length, Petal.Length et Sepal.Width, tandis que la couleur associe une véritable quatrième variable — Petal.Width — de sorte que la figure montre quatre mesures à la fois. C’est l’idée de la « 4D » : colvar est n’importe quelle variable de votre choix, pas nécessairement z.

Ajouter un plan de régression
Modélisez z à partir de x et y avec lm(), prédisez sur une grille, puis transmettez la surface ajustée à scatter3D() via l’argument surf — l’analogue 3D d’une droite de régression. Ici, la consommation de carburant des voitures (mpg) est modélisée à partir du poids (wt) et de la cylindrée (disp) en utilisant le jeu de données mtcars intégré :
data(mtcars)
x <- mtcars$wt
y <- mtcars$disp
z <- mtcars$mpg
# Fit z = a*x + b*y + d and predict on a regular grid
fit <- lm(z ~ x + y)
grid.lines <- 26
x.pred <- seq(min(x), max(x), length.out = grid.lines)
y.pred <- seq(min(y), max(y), length.out = grid.lines)
xy <- expand.grid(x = x.pred, y = y.pred)
z.pred <- matrix(predict(fit, newdata = xy),
nrow = grid.lines, ncol = grid.lines)
fitpoints <- predict(fit) # for the droplines to the surface
scatter3D(x, y, z, pch = 18, cex = 2,
theta = 20, phi = 20, ticktype = "detailed",
xlab = "wt", ylab = "disp", zlab = "mpg",
surf = list(x = x.pred, y = y.pred, z = z.pred,
facets = NA, fit = fitpoints), main = "mtcars")
Passer fit = fitpoints dessine des lignes de projection de chaque point vers la surface : un point au-dessus du plan est sous-estimé, en dessous il est surestimé.
Histogramme 3D
hist3D() dessine un diagramme en barres 3D à partir d’une matrice de hauteurs. En utilisant le jeu de données VADeaths intégré (taux de mortalité par groupe d’âge et catégorie démographique) et en étiquetant les axes avec text3D() :
data(VADeaths)
hist3D(x = 1:5, y = 1:4, z = VADeaths,
bty = "g", phi = 20, theta = -60,
xlab = "", ylab = "", zlab = "", main = "VADeaths",
col = "#0072B2", border = "black", shade = 0.8,
ticktype = "detailed", space = 0.15, d = 2, cex.axis = 1e-9)
# Label the x axis with the demographic groups
text3D(x = 1:5, y = rep(0.5, 5), z = rep(3, 5),
labels = rownames(VADeaths), add = TRUE, adj = 0)
# Label the y axis with the age groups
text3D(x = rep(1, 4), y = 1:4, z = rep(0, 4),
labels = colnames(VADeaths), add = TRUE, adj = 1)
Histogramme 4D : associer une quatrième variable à la couleur
Le geste emblématique de plot3D. Une fonction utilitaire hist3D_fancy() regroupe deux variables en un histogramme de comptage 3D, puis superpose les points bruts sur le plancher colorés selon une quatrième variable — de sorte que vous lisez le comptage (hauteur des barres) et une quatrième mesure (couleur) d’un seul coup. Ici, ce sont des données de séismes (quakes) : les comptages longitude × latitude en barres, avec la profondeur du séisme associée à la couleur :
hist3D_fancy(quakes$long, quakes$lat, colvar = quakes$depth,
breaks = 30)
Quatre variables dans une seule figure — longitude, latitude, comptage et profondeur. Cette astuce de la couleur comme quatrième dimension est la raison d’opter pour plot3D plutôt que pour scatterplot3d ou rgl. (La fonction utilitaire hist3D_fancy() complète se trouve dans le tutoriel original ; elle enveloppe hist3D() + un scatter3D() coloré sur le plan basal.)
Flèches 3D
arrows3D() dessine des flèches d’un point de départ vers un point d’arrivée — pratique pour des vecteurs, des saturations (loadings) ou des diagrammes de forces. Colorez-les selon une variable et étiquetez-les avec text3D() :
x0 <- y0 <- z0 <- c(0, 0, 0, 0)
x1 <- c(0.89, -0.46, 0.99, 0.96)
y1 <- c(0.36, 0.88, 0.02, 0.06)
z1 <- c(-0.28, 0.09, 0.05, 0.24)
cols <- c("#1B9E77", "#D95F02", "#7570B3", "#E7298A")
arrows3D(x0, y0, z0, x1, y1, z1, colvar = x1^2, col = cols,
lwd = 2, d = 3, clab = c("Quality", "score"),
main = "Arrows 3D", bty = "g", ticktype = "detailed")
points3D(x0, y0, z0, add = TRUE, col = "darkred",
colkey = FALSE, pch = 19, cex = 1)
text3D(x1, y1, z1, c("Sepal.L", "Sepal.W", "Petal.L", "Petal.W"),
colvar = x1^2, col = cols, add = TRUE, colkey = FALSE)
Les fonctions apparentées segments3D() et rect3D() fonctionnent de la même façon pour les segments de ligne et les rectangles, et chaque fonction *3D a une contrepartie *2D (scatter2D, text2D, arrows2D, rect2D) pour les versions planes.
Rendre le graphique interactif
plot3D est un package statique — les figures ci-dessus sont des images fixes, parfaites pour les articles et les rapports PDF. Pour faire pivoter et zoomer un graphique plot3D à la souris, son package complémentaire plot3Drgl redessine le dernier graphique via OpenGL : créez la figure avec plot3D, puis appelez plotrgl().
library("plot3Drgl")
plotrgl() # re-draw the current plot3D figure in an interactive rgl windowPour un nuage de points 3D interactif adapté au web qui s’intègre directement dans une page HTML, plotly est le choix moderne — traité dans notre article complémentaire ci-dessous.
Foire aux questions
Installez et chargez le package (install.packages("plot3D"); library(plot3D)), puis appelez scatter3D(x, y, z) avec trois vecteurs numériques. Par défaut, elle colore les points selon la variable z et ajoute une légende de couleur. Utilisez hist3D() pour un diagramme en barres 3D, lines3D()/text3D() pour les lignes et les étiquettes, et l’argument surf pour superposer un plan de régression.
Un graphique « 4D » montre quatre variables à la fois : les trois axes (x, y, z) plus une quatrième variable associée à la couleur avec une légende, via l’argument colvar. scatter3D(x, y, z, colvar = w) colore les points selon w ; la recette hist3D_fancy() superpose des points colorés sur un histogramme de comptage 3D. Cette utilisation de la couleur comme quatrième dimension est ce que scatterplot3d et rgl ne font pas facilement.
Désactivez la coloration automatique avec colvar = NULL et passez à col un vecteur par point en indexant une palette avec les codes entiers de votre facteur : scatter3D(x, y, z, colvar = NULL, col = c("#1B9E77", "#D95F02", "#7570B3")[as.integer(df$group)], colkey = FALSE). Ajoutez ensuite une légende discrète avec la fonction legend() de R de base — legend("right", legend = levels(df$group), col = c("#1B9E77", "#D95F02", "#7570B3"), pch = 18). (Notez que l’argument est colvar, pas col.var — une faute d’orthographe revient silencieusement à colorer selon z.)
Utilisez hist3D(x, y, z = mat) où z est une matrice de hauteurs de barres (lignes indexées par x, colonnes par y). Définissez bty = "g" pour une grille grise, ticktype = "detailed" pour des graduations numériques, et ajoutez des étiquettes d’axes avec text3D(..., add = TRUE). La matrice VADeaths intégrée est un exemple pratique.
Pas à lui seul — plot3D produit des figures statiques. Son package complémentaire plot3Drgl redessine le dernier graphique plot3D via OpenGL pour une rotation et un zoom interactifs (plotrgl()). Pour un graphique qui s’intègre dans une page web, utilisez plutôt la trace scatter3d de plotly — voir l’article complémentaire ci-dessous.
Pour aller plus loin
- Nuages de points 3D en R avec scatterplot3d et plotly — la voie statique plus simple et la voie interactive que l’on peut faire pivoter et intégrer au web. · Série ggplot2 · Visualisation de données.
Conclusion
plot3D est la boîte à outils 3D statique la plus complète en R base-graphics : scatter3D, hist3D, plans de régression, graphiques de lignes, intervalles de confiance et flèches — tous prêts à publier. Sa caractéristique phare est la quatrième dimension : associez n’importe quelle variable supplémentaire à la couleur avec colvar et une légende, et lisez quatre variables dans une seule figure. Copiez n’importe quel bloc ci-dessus et exécutez-le en local pour reproduire les graphiques ; quand vous avez besoin d’une version que l’on peut faire pivoter, optez pour plot3Drgl (bureau) ou plotly (web).
Demandez à Prova « transforme mes données à quatre colonnes en un nuage scatter3D plot3D coloré selon la quatrième variable avec une légende » — elle répond avec du code que vous pouvez exécuter sur vos propres données. The runtime is the judge. Demander à Prova →
Citation
@online{kassambara2026,
author = {Kassambara, Alboukadel},
title = {Graphiques 3D et 4D en R avec le package plot3D},
date = {2026-07-12},
url = {https://www.datanovia.com/blog/plot3d-in-r},
langid = {fr}
}