2009-12-13 37 views
58

Ho una serie di dati 3-tuple (X, Y, Z punti) che voglio tracciare utilizzando R.Tracciando un grafico superficie 3D con la mappa profilo di sovrapposizione, utilizzando R

Voglio creare una trama di superficie dai dati e sovrapporre una mappa di contorno sulla trama della superficie, in modo da creare l'impressione che la mappa del profilo sia l'ombra o la proiezione dalla trama della superficie. La mappa del contorno deve apparire sotto la trama della superficie.

miei set di dati sembra un po 'come questo:

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

Come posso raggiungere questo obiettivo?

risposta

83

Edit:

ho appena visto che lei ha ricordato una delle tue dimensioni è una data. In tal caso, have a look at Jeff Ryan's chartSeries3d progettato per rappresentare serie temporali tridimensionali. Qui egli mostra la curva dei rendimenti nel corso del tempo:

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

risposta originale:

A quanto mi risulta, si desidera una mappa countour di essere la proiezione sul piano sotto la trama superficie 3D. Non credo che ci sia un modo semplice per fare questo oltre a creare i due grafici e quindi combinarli. È possibile find the spatial view helpful for this.

ci sono due pacchetti primaria R per la stampa 3D: rgl (oppure è possibile utilizzare il relativo pacchetto di misc3d) e scatterplot3d.

pacchetto rgl

Il RGL utilizza OpenGL per creare grafici 3D interattivi (read more on the rgl website). Ecco un esempio utilizzando la funzione 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") 

Il parametro alfa rende questa superficie parzialmente trasparente. Ora hai una trama 3D interattiva di una superficie e vuoi creare una mappa di countour al di sotto. RGL consente di aggiungere più grafici a un'immagine esistente:

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

In questa superficie mi impostare le altezze = 1 in modo da avere un piano sotto l'altra superficie. Questo finisce per guardare come questo, e può essere ruotato con un mouse:

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

scatterplot3d

scatterplot3d è un po 'più come le altre funzioni plottaggio in R (read the vignette). Ecco un semplice esempio:

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) 

In questo caso, è necessario sovrapporre le immagini. The R-Wiki has a nice post on creating a tanslucent background image.

+0

Grazie mille Shane. Penso che questo sia un ottimo punto di partenza.Per inciso, potresti aver notato che uno degli assi è cronologico (cioè la data). Devo fare qualche manipolazione prima di tentare di tracciare, o R (o effettivamente il pacchetto rgl), gestire correttamente le date? –

+0

Ciao Shane, grazie mille per il tuo aiuto. Mi hai dato delle munizioni sufficienti per essere ammesso con. Se dovessi incontrare problemi più specifici, tornerò qui con una domanda più specifica. Segnerò la tua risposta come accettata. –

+0

Mi chiedo se questo potrebbe funzionare anche con i dati del punto? Ho dati lat/long, ogni punto con un certo valore. Potrei usare questi dati anche come "heightmap"? – Stophface

Problemi correlati