Graphiques 3D et 4D en R avec le package plot3D

scatter3D, hist3D statiques et prêts à publier, avec une 4ᵉ dimension en couleur

Data Visualization

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.

Auteur·rice
Date de publication

12 juillet 2026

Modifié

13 juillet 2026

AstuceCe que couvre cet article
  • 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 que scatterplot3d et rgl ne 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. plot3D est 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.Width

Nuage 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)"))
A 3D scatter plot of the iris data with points coloured by the z variable and a colour legend labelled Sepal Width.
Figure 1: Un nuage de points 3D des données iris dessiné avec plot3D, les points colorés automatiquement selon la variable z (Sepal Width) avec une légende de couleur arc-en-ciel à droite.

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)
A 3D scatter plot of the iris data with all points a uniform blue and no colour legend.
Figure 2: Le même nuage de points 3D iris avec la coloration automatique désactivée — tous les points d’un bleu uni uniforme, sans légende de couleur.

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'")
A 3D scatter plot with a full box frame around the cube, points coloured by the z variable.
Figure 3: Un nuage de points 3D des données iris dessiné avec un cadre de boîte complète (bty égale f), la coloration arc-en-ciel des points par défaut, intitulé bty égale f.

"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")))
A 3D scatter plot on a grey grid background with points coloured by a smooth palette and a colour legend.
Figure 4: Un nuage de points 3D des données iris sur un panneau à grille grise, les points colorés avec la palette gg.col à la manière de ggplot2 et une légende de couleur.

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")
A 3D scatter plot with points coloured by iris species and a discrete horizontal colour key labelled with the three species.
Figure 5: Un nuage de points 3D des données iris avec les points colorés selon l’espèce — turquoise, orange et violet — et une légende discrète horizontale intitulée setosa, versicolor, virginica.

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")
A 3D scatter plot of the iris data seen from a rotated viewing angle set by theta and phi, points coloured by z.
Figure 6: Un nuage de points 3D des données iris vu avec theta 15 et phi 20, les points colorés selon la variable z avec une légende de couleur, un angle de caméra plus frontal.

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")
A titled 3D scatter plot of the iris data with all three axes labelled and diamond-shaped points coloured by z.
Figure 7: Un nuage de points 3D des données iris intitulé Iris data avec les axes étiquetés Sepal.Length, Petal.Length, Sepal.Width, des points en losange colorés selon z.

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")
A 3D scatter plot with detailed numeric tick marks and labels on the three axes.
Figure 8: Un nuage de points 3D des données iris sur une grille grise avec des graduations et étiquettes numériques détaillées sur les trois axes, de grands points ronds colorés selon z.

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)
A 3D line plot connecting the iris points with thick colour-graded lines on a grey grid.
Figure 9: Un graphique de lignes 3D des données iris — des points reliés dans l’ordre par d’épaisses lignes colorées selon une échelle arc-en-ciel sur un panneau à grille grise.

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)
A 3D scatter plot with a vertical confidence-interval error bar on each point along the z axis.
Figure 10: Un nuage de points 3D des données iris où chaque point porte une courte barre d’erreur verticale sur l’axe z, les points colorés selon une palette continue avec une légende.

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.

A 3D scatter plot with points coloured by a fourth variable, Petal.Width, and faint projection dots cast onto the back and floor planes.
Figure 11: Un nuage de points 3D coloré des données iris intitulé Iris data, les points colorés selon une quatrième variable (Petal.Width) avec de petits points de projection estompés sur les panneaux arrière et du plancher et une légende de couleur intitulée Petal.Width.

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")
A 3D scatter plot of mtcars with a fitted regression surface and droplines from points to the surface.
Figure 12: Un nuage de points 3D des données mtcars intitulé mtcars avec une surface de régression ajustée (fil de fer) traversant les points et des lignes verticales de projection de chaque point vers la surface, colorés selon mpg.

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)
A 3D bar histogram of the VADeaths data with blue bars, labelled demographic groups on one axis and age bands on the other.
Figure 13: Un histogramme 3D des données VADeaths intitulé VADeaths — des barres 3D bleues sur une grille grise, l’axe x étiqueté avec les catégories démographiques (Rural Male, Rural Female, Urban Male, Urban Female) et l’axe y avec les tranches d’âge de 50-54 à 70-74.

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)
A 3D count histogram of earthquakes above a floor of points coloured by depth, with a colour legend, showing four variables at once.
Figure 14: Un graphique 4D des données quakes — des barres de comptage 3D grises pour les séismes par longitude et latitude s’élevant au-dessus d’un plancher de points colorés selon la profondeur avec une légende de couleur allant du bleu (faible profondeur) au rouge foncé (grande profondeur).

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)
Four coloured 3D arrows from a common origin, each labelled, with a colour legend for a quality score.
Figure 15: Un graphique de flèches 3D intitulé Arrows 3D — quatre flèches colorées rayonnant depuis un point d’origine rouge foncé, chacune étiquetée Sepal.L, Sepal.W, Petal.L, Petal.W, avec une légende de couleur pour un score de qualité.

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 window

Pour 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)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

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

🟢 Avec un agent IA

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 →

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 = {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}
}
Veuillez citer ce travail comme suit :
Kassambara, Alboukadel. 2026. “Graphiques 3D et 4D en R avec le package plot3D.” July 12. https://www.datanovia.com/blog/plot3d-in-r.