Создание трехмерной поверхности из данных временного ряда в R - PullRequest
2 голосов
/ 22 июня 2011

У меня большой набор данных, из которого я хотел бы создать трехмерную поверхность. Я хотел бы, чтобы ось X была датой, ось Y - временем (24 часа), а ось Z (высота) - значением, которое я имею ($). Я начинающий с R, так что чем проще, тем лучше!

http://www.quantmod.com/examples/chartSeries3d/ имеет хороший пример, но код для моего уровня сложности довольно сложный!

Любая помощь будет высоко оценена - все, что я исследовал до сих пор, нуждается в сортировке данных, что, я думаю, не подходит.

1 Ответ

7 голосов
/ 22 июня 2011

Несколько вариантов присутствуют, persp() и wireframe(), последний в упаковке решетка .

Сначала несколько фиктивных данных:

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() нужны данные в виде местоположений сетки x и y и матрицы z наблюдений.

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

и может быть нанесен с помощью:

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

Фасеты можно раскрасить с помощью аргумента col. Вы можете сделать намного хуже, чем изучать код для chartSeries3d0() на странице, на которую вы ссылаетесь. Большая часть кода просто рисует правильные оси, так как ни persp(), ни wireframe() не обрабатывают Date объекты легко.

Что касается wireframe(), то мы

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

Вам нужно будет немного поработать или поработать, чтобы отсортировать метки осей, так как wireframe() на данный момент не работает с объектами класса "Date" (следовательно, приведен как числовой).

...