web-dev-qa-db-fra.com

Tracé d'un tracé de surface 3D avec superposition de carte de contour, à l'aide de R

J'ai un ensemble de données à 3 tuples (points X, Y, Z) que je veux tracer à l'aide de R.

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

Mon ensemble de données ressemble un peu à ceci:

Axis  |  Data Type
-------------------
X     |  Date value
Y     |  Float value
Z     |  Float value

Comment puis-je atteindre cet objectif?

60
Stick it to THE MAN

Modifier:

Je viens de voir que vous avez souligné que l'une de vos dimensions est une date. Dans ce cas, jetez un oeil à chartSeries3d de Jeff Ryan qui est conçu pour représenter graphiquement des séries chronologiques en trois dimensions. Ici, il montre la courbe des taux au fil du temps:

chartSeries example

Réponse originale:

Si je comprends bien, vous voulez qu'une carte de contours soit la projection sur le plan sous le tracé de surface 3D. Je ne pense pas qu'il existe un moyen facile de le faire autre que de créer les deux tracés et de les combiner ensuite. Vous pouvez trouver la vue spatiale utile pour cela .

Il existe deux packages R principaux pour le traçage 3D: rgl (ou vous pouvez utiliser le lien misc3d = package) et scatterplot3d.

rgl

Le package rgl utilise OpenGL pour créer des tracés 3D interactifs ( lire la suite sur le site rgl ). Voici un exemple utilisant le surface3d une fonction:

library(rgl)
data(volcano)
z <- 2 * volcano # Exaggerate the relief
x <- 10 * (1:nrow(z)) # 10 meter spacing (S to N)
y <- 10 * (1:ncol(z)) # 10 meter spacing (E to W)
zlim <- range(z)
zlen <- zlim[2] - zlim[1] + 1
colorlut <- terrain.colors(zlen,alpha=0) # height color lookup table
col <- colorlut[ z-zlim[1]+1 ] # assign colors to heights for each point
open3d()
rgl.surface(x, y, z, color=col, alpha=0.75, back="lines")

Le paramètre alpha rend cette surface partiellement transparente. Vous avez maintenant un tracé 3D interactif d'une surface et vous souhaitez créer une carte de contours en dessous. rgl vous permet d'ajouter plus de tracés à une image existante:

colorlut <- heat.colors(zlen,alpha=1) # use different colors for the contour map
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 défini les hauteurs = 1 de sorte que nous ayons un plan sous l'autre surface. Cela finit par ressembler à ceci et peut être tourné avec une souris:

3D surface plot

scatterplot3d

scatterplot3d est un peu plus comme les autres fonctions de traçage dans R ( lire 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 joli article sur la création d'une image de fond transparente .

85
Shane