Seite 1 von 1

Konvexe Hülle um Punkte in 3D Plot

Verfasst: Fr Dez 16, 2016 2:43 pm
von Romunkel
Ich bin das Tutorial zur Visualisierung von 3-dimensionalen Daten mit dem rgl package durchgegangen, dass hier zu finden ist. http://www.sthda.com/english/wiki/a-com ... ualization

Mit dessen Hilfe konnte ich ein 3D Scatter Plot zeichnen mit dem "iris" Datensatz, sowie ein Ellipsoid, welches das 95% Konfidenzintervall darstellt, dazu zeichen:

Code: Alles auswählen

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)
Bildhttps://www.dropbox.com/s/y2ll8o60fkvg9 ... 1.png?dl=0

Ich weiß, dass die ersten 50 Punkte zu einer eigenen Art gehören und möchte für diese und die restlichen Punkte jeweils eine Ellipsoiden erstellen:

Code: Alles auswählen

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.95)
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.95)
plot3d(ellips1, col = "gold2", alpha = 0.2, add = TRUE, box = FALSE)
plot3d(ellips2, col = "forestgreen", alpha = 0.2, add = TRUE, box = FALSE)
Bildhttps://www.dropbox.com/s/vqu9bdf2iera7 ... 2.png?dl=0

In einem 2D Plot würde ich, um die flächenmäßige Verbreitung der Datenpunkte zu visualisieren ein Polygon um die äußeren Punkte zeichnen. In 3D wäre etwas adäquates meiner Meinung nach eine konvexe Hülle, also ein Polyhedron, das von dreieckicken Flächen begrenzt wird die von jeweils drei äußeren Punkten der Punktwolke begrenzt werden.

Ich denke die Funktion convhulln(), die den QuickHull-Algorithmus verwendet und im package "geometry" enthalten ist könnte hilfreich sein aber ich bin nach tagelangem Versuchen nicht im Stande die Funktion in einem rgl Plot zu verwenden. Kann mir bitte jemand helfen? Ist es auch möglich dies mit Hilfe des "plot3D" package darzustellen, da ich hier http://www.sthda.com/english/wiki/impre ... ualization ein hilfreiches Tutorial gefunden haben, das ich verwenden könnte um ein schönes 3D Plot mit meinen eigenen Daten zu erstellen.

Ich bin Biologe der dies für wissenschaftliche Zwecke verwendet und kein Mathematiker oder R Profi, also wäre es schön wenn ihr eure Lösungsschritte kurz erklärt. Vielen Dank.

Re: Konvexe Hülle um Punkte in 3D Plot

Verfasst: Fr Dez 16, 2016 3:19 pm
von jogo
Hallo Romunkel,

willkommen im Forum!
Hier habe ich ein Paket gefunden, das das kann (laut Beschreibung).
https://cran.r-project.org/web/packages ... ometry.pdf

https://lmgtfy.com/?q=%5Br%5D+convex+hull

Hoffentlich hilft Dir das weiter.
Gruß, Jörg

Re: Konvexe Hülle um Punkte in 3D Plot

Verfasst: Mo Dez 19, 2016 6:52 pm
von Romunkel
Hallo jogo,

ich sagte ja dass das geometry package die Lösung parat hält, ich war nur nicht in der Lage es zu visualisieren. Trotzdem danke.

Aber ein Freund hat mir jetzt geholfen eine Lösung zu finden; hier ist sie:

Code: Alles auswählen

library(geometry)
ps1 <- matrix(c(x[1:50],y[1:50],z[1:50]), ncol=3) 
ts.surf1 <- t(convhulln(ps1))  
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)
ts.surf2 <- t(convhulln(ps2))
convex2 <-  rgl.triangles(ps2[ts.surf2,1],ps2[ts.surf2,2],ps2[ts.surf2,3],col="forestgreen",alpha=.6)
Damit werden jeweils konvexe Hüllen um die beiden dreidimensionalen Punktwolken generiert und visualisiert.

Re: Konvexe Hülle um Punkte in 3D Plot

Verfasst: Mi Dez 21, 2016 10:51 am
von jogo
Hallo Romunkel,

hm, da hatte ich wohl die eigentliche Aufgabe nicht verstanden.
Schön, dass Du jetzt eine Lösung für das Problem hast

Viele Grüße, Jörg