2011-06-21 13 views
1

J'ai un grand ensemble de données dont j'aimerais créer une surface 3D. Je voudrais que l'axe des x soit la date, l'axe des y soit le temps (24h) et l'axe des z (hauteur) soit une valeur que j'ai ($). Je suis un débutant avec R, donc plus c'est simple, mieux c'est!Création d'une surface 3D à partir de données de séries temporelles dans R

http://www.quantmod.com/examples/chartSeries3d/ a un bel exemple, mais le code est trop compliqué pour mon niveau de compétence!

Toute aide serait grandement appréciée - tout ce que j'ai recherché jusqu'ici doit être trié, ce qui ne me convient pas.

+3

Je suggérerais d'essayer de comprendre comment cette figure a été faite, puis de poser des questions plus précises en fonction de l'endroit où vous êtes coincé. – Stedy

+0

Vérifiez le paquet 'lattice', en particulier voir les exemples de' wireframe' (vous pouvez le faire en chargeant le paquet 'lattice' puis en exécutant' example (wireframe) '). – nullglob

+0

Si vous postez quelques exemples de données, il sera beaucoup plus facile de vous aider. Voir http://stackoverflow.com/q/5963269/602276 pour des conseils sur poser une bonne question – Andrie

Répondre

6

Plusieurs options se présentent, persp() et wireframe(), ce dernier dans le paquet treillis.

d'abord certaines données fictives:

set.seed(3) 
dat <- data.frame(Dates = rep(seq(Sys.Date(), Sys.Date() + 9, by = 1), 
           each = 24), 
        Times = rep(0:23, times = 10), 
        Value = rep(c(0:12,11:1), times = 10) + rnorm(240)) 

persp() a besoin des données comme les x et y emplacements de grille et une matrice z d'observations.

new.dates <- with(dat, sort(unique(Dates))) 
new.times <- with(dat, sort(unique(Times))) 
new.values <- with(dat, matrix(Value, nrow = 10, ncol = 24, byrow = TRUE)) 

et peuvent être placés en utilisant:

persp(new.dates, new.times, new.values, ticktype = "detailed", r = 10, 
     theta = 35, scale = FALSE) 

Les facettes peuvent être colorés en utilisant l'argument col. Vous pourriez faire beaucoup pire que d'étudier le code pour chartSeries3d0() à la page que vous avez référencé. La plupart du code dessine juste les axes appropriés car ni persp() ni wireframe() manipulent facilement les objets Date.

Quant à wireframe(), nous

require(lattice) 
wireframe(Value ~ as.numeric(Dates) + Times, data = dat, drape = TRUE) 

Vous aurez besoin de faire un peu ou de travail pour trier l'étiquetage de l'axe comme wireframe() ne fonctionne pas avec des objets de la classe "Date" au moment (d'où le casting comme numérique).

+0

Merci beaucoup Gavin, je vais donner un essai –

+0

@ Mark McMullan Si vous êtes satisfait d'un Asnwer s'il vous plaît le marquer accepté par cocher la grosse coche à gauche de la réponse. Pas de soucis si ce n'est pas une réponse complète finale, vous n'avez pas besoin d'accepter de telles réponses. –

Questions connexes