2016-12-14 2 views
1

folgte ich das Tutorial über 3D-Visualisierung des Paket "RGL" hereBild Convex Rumpf in 3D Scatter Plot

So verwenden konnte ich ein 3D-Streudiagramm mit "Iris" Daten ziehen und einen Ellipsoid rund um 95% erstellen der Datenpunkte:

library("rgl") 
data(iris) 
x <- sep.l <- iris$Sepal.Length 
y <- pet.l <- iris$Petal.Length 
z <- sep.w <- iris$Sepal.Width 
plot3d(x, y, z, col="blue", box = FALSE, 
    type ="s", radius = 0.15) 
ellips <- ellipse3d(cov(cbind(x,y,z)), 
       centre=c(mean(x), mean(y), mean(z)), level = 0.95) 
plot3d(ellips, col = "blue", alpha = 0.2, add = TRUE, box = FALSE) 

ich weiß, dass die ersten 50 Datenpunkte gehören zu einer anderen Population der den Rest des Datensatzes verglichen, so sie in einer anderen Art und Weise färben und uns zwei Ellipsoide sie decken:

plot3d(x, y, z, col=c(rep("gold2",50),rep("forestgreen",100)), box = FALSE, 
    type ="s", radius = 0.15) 
ellips1 <- ellipse3d(cov(cbind(x[1:50],y[1:50],z[1:50])), 
       centre=c(mean(x[1:50]), mean(y[1:50]), mean(z[1:50])), level = 0.999) 
ellips2 <- ellipse3d(cov(cbind(x[51:150],y[51:150],z[51:150])), 
       centre=c(mean(x[51:150]), mean(y[51:150]), mean(z[51:150])), level = 0.999) 
plot3d(ellips1, col = "gold2", alpha = 0.2, add = TRUE, box = FALSE) 
plot3d(ellips2, col = "forestgreen", alpha = 0.2, add = TRUE, box = FALSE) 

Obwohl beide Populationen deutlich voneinander unterschieden werden können, berühren sich die Ellipsoide. Daher sind die Ellipsoide keine gute visuelle Darstellung der Datenpunkte. In einem 2D-Plot würde ich ein Polynom bevorzugen, das alle Datenpunkte umgibt, aber in 3D sollte etwas wie eine konvexe Hülle angemessen sein, d. H. Ein Polyeder, bestehend aus Dreiecksflächen, die jeweils drei äußere Datenpunkte kombinieren.

Ich denke, die Funktion Convhulln() mit dem QuickHull-Algorithmus im Paket "Geometrie" wäre hilfreich, aber ich bin nicht in der Lage, dies zu verwenden.

Hat jemand eine Idee, wie man sich eine solche konvexe Hülle im rgl-Plot vorstellen kann? Ist es auch möglich, dies mit dem Paket plot3D zu tun, da es ein tolles Tutorial here gibt, das ich verwenden könnte, um eine schöne Handlung mit meinen eigenen Daten zu machen.

Ich bin "nur" ein Biologe, der R für die Wissenschaft und nicht einen Mathematiker oder R-Programmierer verwendet, also bitte erläutern Sie Ihre Lösung für mich. Danke vielmals.

+0

Haben Sie versucht, die die R-Geometrie-Paket? Wenn Sie Probleme damit haben, kann ich helfen –

+0

Ja, ich habe es versucht. Ich denke, die Funktion convhulln() könnte hilfreich sein, aber ich konnte das Ergebnis nicht in einen rbl- oder plot3D-Plot einfügen. "convhulln (cbind (x, y, z))" ergibt eine Matrix, aber mit sehr hohen ganzzahligen Werten, höher als die von cbind (x, y, z). Entweder funktioniert etwas nicht oder ich verstehe die Ausgabe nicht. – ossesso

Antwort

1

fand heraus Hey die Antwort hier ist es:

library("rgl") 
data(iris) 
x <- sep.l <- iris$Sepal.Length 
y <- pet.l <- iris$Petal.Length 
z <- sep.w <- iris$Sepal.Width 
plot3d(x, y, z, col="blue", box = FALSE, 
    type ="s", radius = 0.15) 
ellips <- ellipse3d(cov(cbind(x,y,z)), 
       centre=c(mean(x), mean(y), mean(z)), level = 0.95) 
plot3d(ellips, col = "blue", alpha = 0.2, add = TRUE, box = FALSE) 

plot3d(x, y, z, col=c(rep("gold2",50),rep("forestgreen",100)), box = FALSE, 
    type ="s", radius = 0.15) 

Nach dem, was, was du oben habe ich diese hinzugefügt:

library(geometry) 
ps1 <- matrix(c(x[1:50],y[1:50],z[1:50]), ncol=3) # generate points on a sphere 
ts.surf1 <- t(convhulln(ps1)) # see the qhull documentations for the options 

convex1 <- rgl.triangles(ps1[ts.surf1,1],ps1[ts.surf1,2],ps1[ts.surf1,3],col="gold2",alpha=.6) 

ps2 <- matrix(c(x[51:150],y[51:150],z[51:150]), ncol=3) # generate points on a sphere 
ts.surf2 <- t(convhulln(ps2)) # see the qhull documentations for the options 

convex2 <- rgl.triangles(ps2[ts.surf2,1],ps2[ts.surf2,2],ps2[ts.surf2,3],col="forestgreen",alpha=.6) 
+0

Oh vielen Dank! Genau das habe ich gesucht und es funktioniert auch mit meinen eigenen Daten. – ossesso