2009-09-10 3 views
9

J'ai une surface sympa qui représente les résultats de régression multi-parties non linéaires sur une régression avec deux variables indépendantes. Je voudrais tracer les valeurs prédites de régression comme une belle surface 3D et ensuite montrer les valeurs réelles comme point qui rebondissent autour de la surface. Ce serait la version 3D de tracer une ligne de régression et montrant les réels comme des points autour de la ligne. Je ne peux pas comprendre comment faire cela avec treillis. Je suis heureux d'utiliser une autre bibliothèque graphique dans R, mais je ne connais pas d'autres qui font des tracés 3D.Tracer un filaire ET un nuage avec treillis dans R

est ici une version simplifiée de ce que je veux faire:

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 est ma surface lisse et z2 sont mes points bruyants surtout légèrement au-dessus de la surface. Ainsi, la surface ressemble à ceci:

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

alt text http://www.cerebralmastication.com/wp-content/uploads/2009/09/wireframe.png

et le nuage de points ressemble à ceci:

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

alt text http://www.cerebralmastication.com/wp-content/uploads/2009/09/cloud.png

Est-il possible d'obtenir ces deux dans un panneau de treillis?

Répondre

0

Si la mémoire est présente, Rcmdr le fait déjà pour vous en utilisant le paramètre rgl. Cela peut être limité aux modèles que Rcmdr adapte, cependant. D'autre part, il vous donne (rapide!) Défilement, zoom, ... quel treillis ne peut pas faire.

+0

Je lésiné sur ma boîte Linux carte graphique parce que « je ne joue pas » mais je pense RGL bénéficierait certainement si j'avais décidé autrement! – hatmatrix

+0

Je le garde aussi simple ("pas de jeux") mais OpenGL travaille souvent sur du matériel très simple. Essayez-le - je me souviens que vous avez seulement besoin d'un support 2d. –

6

J'aime vraiment! Mais il y a des moments où les tracés 3D en treillis sont également utiles - vous pouvez écrire votre propre fonction que vous pouvez passer à l'argument 'panel' pour les fonctions de treillis. Par exemple,

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) 

La dernière fonction que vous appelez peut être wireframe() ou cloud(); dans les deux cas, puisque panel.wireframe() et panel.cloud() sont appelés dans la fonction panel, le résultat devrait être le même.

Edit: Merci d'avoir signalé cela, Aaron, alors probablement vous pouvez passer z2 comme une autre variable:

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

Nice! Mais pour utiliser les points de 'z2' au lieu de' z' pour le nuage, utilisez 'panel.cloud (x, y, myGrid $ z2)' dans la fonction 'mypanel'. – Aaron

+0

Oh, et comment dessiner le nuage, mais pour différents x et y? – Rekin

+0

Vous pouvez probablement 1) rbind() un autre ensemble de x, y, z à myGrid, 2) ajouter une valeur catégorielle à myGrid, et 3) passer cette variable catégorique (facteur) à l'argument groups. – hatmatrix

Questions connexes