Построение каркаса И облака с решеткой в ​​R - PullRequest
9 голосов
/ 10 сентября 2009

У меня хорошая поверхность, которая представляет результаты нелинейной многочастичной регрессии с двумя независимыми переменными. Я хотел бы построить прогнозируемые значения регрессии в виде красивой трехмерной поверхности, а затем показать фактические значения в виде точек, которые отражаются от поверхности. Это будет трехмерная версия построения линии регрессии и отображения фактических значений в виде точек вокруг линии. Я не могу понять, как это сделать с решеткой. Я счастлив использовать другую графическую библиотеку в R, но я не знаю других, которые делают 3D-графики.

Вот упрощенная версия того, что я хочу сделать:

library(lattice)
#set up some simplified data
x <- seq(-.8, .8, .1)
y <- seq(-.8, .8, .1)
myGrid <- data.frame(expand.grid(x,y))
colnames(myGrid) <- c("x","y")
myGrid$z <- myGrid$x + myGrid$y
noise <- rnorm(length(myGrid$z),.3,.2)
myGrid$z2 <- myGrid$x + myGrid$y + noise

z - моя гладкая поверхность, а z2 - мои шумные точки, в основном немного выше поверхности. Итак, поверхность выглядит так:

wireframe(myGrid$z ~ myGrid$x * myGrid$y, xlab="X", ylab="Y", zlab="Z")

enter image description here

и облако точек выглядит так:

cloud(myGrid$z2 ~ myGrid$x * myGrid$y, xlab="X", ylab="Y", zlab="Z")

enter image description here

Можно ли получить оба из них на одной решетчатой ​​панели?

Ответы [ 2 ]

6 голосов
/ 15 сентября 2009

Я люблю ргл! Но бывают случаи, когда трехмерные графики в решетке также полезны - вы можете написать свою собственную функцию, которую вы можете передать аргументу «панели» функциям решетки. Например,

mypanel <- function(x,y,z,...) {
  panel.wireframe(x,y,z,...)
  panel.cloud(x,y,z,...)
}
wireframe(myGrid$z ~ myGrid$x * myGrid$y, xlab="X", ylab="Y", zlab="Z",
          panel=mypanel)

Последняя функция, которую вы вызываете, может быть wireframe () или cloud (); в любом случае, так как panel.wireframe () и panel.cloud () вызываются внутри функции панели, результат должен быть одинаковым.

Edit: Спасибо за указание на это, Аарон, тогда, вероятно, вы можете передать z2 в качестве другой переменной:

mypanel <- function(x,y,z,z2,...) {
  panel.wireframe(x,y,z,...)
  panel.cloud(x,y,z2,...)
}
wireframe(z ~ x * y, data=myGrid, xlab="X", ylab="Y", zlab="Z",
          panel=mypanel, z2=myGrid$z2)
0 голосов
/ 10 сентября 2009

Если память служит, Rcmdr уже делает это для вас, используя rgl. Это может быть ограничено моделями, которые подходят Rcmdr, хотя.

С другой стороны, он обеспечивает (быструю!) Прокрутку, масштабирование, ... чего не может сделать решетка.

...