HOWTO · R

Comment créer un tracé de surface 3D à partir de coordonnées (x,y,z)

Créez un tracé de surface 3D dans R à partir d'observations éparses (x, y, z) en interpolant une grille avec akima et en la dessinant avec rgl.

Sur cette page

Pour créer un tracé de surface 3D dans R à partir d’observations éparses (x, y, z), estimez des valeurs z sur une grille avec akima::interp(), puis dessinez cette grille avec rgl::persp3d(). Ajoutez les observations d’origine avec rgl::points3d() pour comparer les mesures à la surface estimée. L’interpolation fournit des estimations entre les observations ; elle ne garantit pas que la surface estimée corresponde à une fonction sous-jacente inconnue.

Interpoler les valeurs Z avec akima::interp()

Un moteur de rendu de surface a besoin de valeurs z associées à une grille de coordonnées x et y. Les observations éparses ne forment généralement pas cette grille, donc l’interpolation estime des valeurs aux positions de la grille à partir des données x, y et z mesurées. Gardez les trois vecteurs d’entrée alignés : les valeurs au même index doivent décrire la même observation. Par exemple, x[i], y[i] et z[i] constituent un point mesuré.

La fonction akima::interp() accepte ces vecteurs de coordonnées et renvoie des coordonnées de grille x et y ainsi qu’une matrice de valeurs z interpolées. Cette structure est utile pour le tracé car les entrées de la matrice correspondent à des positions sur la grille de coordonnées renvoyée. Les estimations dépendent des mesures et de la méthode d’interpolation ; ce ne sont pas des observations supplémentaires. Inspectez les coordonnées et la matrice renvoyées lorsque vous adaptez l’exemple à vos données, surtout si vos observations sont rares ou inégalement réparties.

Installez les paquets requis une fois avec install.packages(c("akima", "rgl")). Chargez-les dans la session R avec library(akima) et library(rgl), ou appelez leurs fonctions avec les préfixes de paquet indiqués ci-dessous. Les fonctions d’interpolation et de rendu sont également écrites avec des préfixes de paquet explicites dans l’exemple pour indiquer clairement leur origine.

Tracer la surface avec rgl::persp3d()

Transmettez les coordonnées x, les coordonnées y et la matrice z du résultat de l’interpolation à rgl::persp3d(). Cela dessine la grille estimée sous forme de surface. Transmettez ensuite les vecteurs x, y et z d’origine à rgl::points3d() pour superposer les points mesurés. Garder les deux couches visibles aide à distinguer les données observées des valeurs estimées entre les observations.

La vue rgl est interactive dans un environnement graphique approprié : faites-la pivoter pour inspecter la forme sous un autre angle et zoomez pour examiner les détails. L’apparence de la vue dépend de la session R et de l’environnement graphique. Dans un contexte non interactif, l’affichage peut ne pas s’ouvrir comme une fenêtre de bureau ; utilisez un environnement qui prend en charge rgl lorsque vous devez manipuler la vue.

Exemple complet : interpoler et tracer une surface 3D

Installez akima et rgl une fois avec install.packages(c("akima", "rgl")). Avec les deux paquets disponibles, le flux de travail des paquets est surface <- akima::interp(x, y, z, nx = 3, ny = 3), suivi de rgl::persp3d(surface$x, surface$y, surface$z) et rgl::points3d(x, y, z). L’exemple exécutable ci-dessous utilise un ensemble complet d’observations d’échantillon de 3 par 3, donc R de base peut également dessiner la même grille lorsque l’un des paquets de tracé facultatifs est indisponible. Pour des mesures éparses, utilisez l’appel akima::interp() ci-dessus pour estimer les valeurs de la grille avant de tracer.

x <- c(0, 1, 2, 0, 1, 2, 0, 1, 2)
y <- c(0, 0, 0, 1, 1, 1, 2, 2, 2)
z <- c(0, 1, 0, 1, 2, 1, 0, 1, 0)

if (requireNamespace("akima", quietly = TRUE)) {
  surface <- akima::interp(x = x, y = y, z = z, nx = 3, ny = 3)
  z_grid <- surface$z
  x_grid <- surface$x
  y_grid <- surface$y
} else {
  z_grid <- matrix(z, nrow = 3, byrow = TRUE)
  x_grid <- y_grid <- 0:2
}

if (requireNamespace("rgl", quietly = TRUE)) {
  rgl::persp3d(x = x_grid, y = y_grid, z = z_grid, col = "lightblue")
  rgl::points3d(x = x, y = y, z = z, col = "red", size = 6)
} else {
  persp(x = x_grid, y = y_grid, z = z_grid, col = "lightblue")
}

cat("Grid dimensions:", nrow(z_grid), "x", ncol(z_grid), "\n")

Les vecteurs d’échantillon décrivent neuf observations sur une grille régulière. Lorsque akima est installé, le script obtient sa grille à partir de akima::interp() ; sinon, il utilise directement les valeurs de grille régulière fournies. Il utilise rgl::persp3d() et rgl::points3d() lorsque rgl est installé, avec persp() de R de base comme solution de dessin de repli. La sortie en ligne de commande est :

Grid dimensions: 3 x 3

Pour des mesures éparses, installez les deux paquets et utilisez les appels akima et rgl décrits ci-dessus. Les valeurs de grille affichées sont des estimations dérivées des données d’entrée, tandis que les points superposés restent les observations d’origine. La vue interactive dépend de la session R et de l’environnement graphique ; utilisez une session avec capacités graphiques lorsque vous devez la faire pivoter ou zoomer. Gardez les entrées x, y et z alignées lorsque vous remplacez les vecteurs d’échantillon.