Konvexe Hülle um Punkte in 3D Plot

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
Romunkel

Konvexe Hülle um Punkte in 3D Plot

Beitrag 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.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

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

Beitrag 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
Romunkel

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

Beitrag 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.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

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

Beitrag 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
Antworten