2009-12-13 7 views
58

je un ensemble de données 3-tuple (X, Y, Z points) que je veux tracer à l'aide R.Tracer une courbe de surface en 3D avec superposition de la carte de contour, en utilisant R

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

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

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

Comment puis-je y parvenir?

Répondre

83

Edit:

Je viens de voir que vous l'avez dit un de vos dimensions est une date. Dans ce cas, have a look at Jeff Ryan's chartSeries3d qui est conçu pour tracer des séries temporelles tridimensionnelles. Ici, il montre la courbe de rendement au fil du temps:

chartSeries example http://www.quantmod.com/examples/chartSeries3d/chartSeries3d-thumb.png

Réponse d'origine:

Si je comprends bien, vous voulez une carte de Countour à la projection sur le plan en dessous de la courbe de surface 3D. Je ne crois pas qu'il existe un moyen facile de le faire autrement que de créer les deux parcelles, puis de les combiner. Vous pouvez find the spatial view helpful for this.

Il y a deux packages R primaire pour avoir comploté en 3D: rgl (ou vous pouvez utiliser le paquet misc3d liées) et scatterplot3d.

RGL

Le paquet RGL utilise OpenGL pour créer interactifs tracés 3D (read more on the rgl website). Voici un exemple utilisant la fonction surface3d:

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. Maintenant, vous avez un tracé 3D interactif d'une surface et vous voulez créer une carte de contours en dessous. RGL vous permet d'ajouter plus de parcelles à 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, je régler les hauteurs = 1 de sorte que nous avons un plan dessous de l'autre surface. Cela finit par ressembler à cela, et peut être tourné avec une souris:

3D surface plot http://i45.tinypic.com/12637gy.jpg

scatterplot3d

scatterplot3d est un peu plus comme d'autres fonctions dans complotant R (read the 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 has a nice post on creating a tanslucent background image.

+0

Merci beaucoup Shane. Je pense que c'est un très bon point de départ.Incidemment, vous avez peut-être remarqué que l'un des axes est chronologique (c'est-à-dire date). Ai-je besoin de faire des manipulations avant d'essayer de tracer, ou est-ce que R (ou bien le package rgl) va gérer les dates correctement? –

+0

Salut Shane, merci beaucoup pour votre aide. Vous m'avez donné suffisamment de munitions pour être mis en boîte. Si je rencontre des problèmes plus spécifiques, je reviendrai ici avec une question plus spécifique. Je marquerai votre réponse comme acceptée. –

+0

Je me demande si cela fonctionnerait aussi avec des données ponctuelles? J'ai des données lat/longues, chaque point ayant une certaine valeur. Puis-je utiliser ces données comme une "heightmap" aussi? – Stophface