61 votes

Représentation d'un tracé de surface 3D avec superposition de carte de contour, en utilisant R

Je dispose d'un ensemble de données en 3-tuple (points X, Y, Z) que je veux tracer à l'aide de R.

Je veux créer un graphique de surface à partir des données et superposer une carte de contour sur le graphique de surface, de manière à créer l'impression que la carte de contour est l'« ombre » ou la projection du graphique de surface. La carte de contour doit apparaître sous le graphique de surface.

Mon ensemble de données ressemble plus ou moins à ceci :

Axe  |  Type de données
-------------------
X     |  Valeur de date
Y     |  Valeur flottante
Z     |  Valeur flottante

Comment puis-je y parvenir?

87voto

Shane Points 40885

Éditer :

Je viens de voir que vous avez indiqué qu'une de vos dimensions est une date. Dans ce cas, regardez le chartSeries3d de Jeff Ryan qui est conçu pour représenter des séries temporelles en 3 dimensions. Ici, il montre la courbe des rendements au fil du temps :

exemple de chartSeries

Réponse Originale :

Si je comprends bien, vous voulez qu'une carte de contours soit la projection sur le plan situé en dessous du graphique en surface 3D. Je ne pense pas qu'il y ait de moyen facile de le faire autrement qu'en créant les deux graphiques et en les combinant ensuite. Vous pouvez trouver la vue spatiale utile pour cela.

Il existe deux packages principaux pour le tracé en 3D sur R : rgl (ou vous pouvez utiliser le package associé misc3d) et scatterplot3d.

rgl

Le package rgl utilise OpenGL pour créer des graphiques interactifs en 3D (en savoir plus sur le site rgl). Voici un exemple utilisant la fonction surface3d:

library(rgl)
data(volcano)
z <- 2 * volcano # Exagérer le relief
x <- 10 * (1:nrow(z)) # Espacement de 10 mètres (S au N)
y <- 10 * (1:ncol(z)) # Espacement de 10 mètres (E au O)
zlim <- range(z)
zlen <- zlim[2] - zlim[1] + 1
colorlut <- terrain.colors(zlen,alpha=0) # table de recherche des couleurs de hauteur
col <- colorlut[ z-zlim[1]+1 ] # attribuer des couleurs aux hauteurs pour chaque point
open3d()
rgl.surface(x, y, z, color=col, alpha=0.75, back="lines")

Le paramètre alpha rend cette surface partiellement transparente. Maintenant, vous avez un graphique interactif en 3D d'une surface et vous voulez créer une carte de contours en dessous. rgl vous permet d'ajouter d'autres graphiques à une image existante :

colorlut <- heat.colors(zlen,alpha=1) # utiliser des couleurs différentes pour la carte de contours
col <- colorlut[ z-zlim[1]+1 ] 
rgl.surface(x, y, matrix(1, nrow(z), ncol(z)),color=col, back="fill")

Dans cette surface, j'ai fixé les hauteurs à 1 pour avoir un plan en dessous de l'autre surface. Cela donne l'apparence suivante, et peut être tournée avec une souris :

graphique de surface 3D

scatterplot3d

scatterplot3d ressemble un peu plus aux autres fonctions de tracé de R (lisez la vignette). Voici un exemple simple :

temp <- seq(-pi, 0, length = 50)
x <- c(rep(1, 50) %*% t(cos(temp)))
y <- c(cos(temp) %*% t(sin(temp)))
z <- c(sin(temp) %*% t(sin(temp)))
scatterplot3d(x, y, z, highlight.3d=TRUE,
 col.axis="blue", col.grid="lightblue",
 main="scatterplot3d - 2", pch=20)

Dans ce cas, vous devrez superposer les images. Le R-Wiki a un article intéressant sur la création d'une image de fond translucide.

0 votes

Merci beaucoup Shane. Je pense que c'est un très bon point de départ. Au fait, vous avez peut-être remarqué qu'un des axes est chronologique (c'est-à-dire la date). Dois-je effectuer une quelconque manipulation avant de tenter de tracer le graphique, ou est-ce que R (ou même le package rgl), gérera les dates correctement ?

0 votes

Salut Shane, merci beaucoup pour ton aide. Tu m'as donné suffisamment de munitions pour commencer. Si je rencontre d'autres problèmes spécifiques, je reviendrai ici avec une question plus précise. Je vais marquer ta réponse comme acceptée.

0 votes

Je me demande si cela fonctionnerait aussi avec des données de points ? J'ai des données lat/long, chaque point ayant une certaine valeur. Pourrais-je utiliser ces données comme une "carte de relief" également ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X