gpt4 book ai didi

r - 在 3D 散点图中绘制凸包

转载 作者:行者123 更新时间:2023-12-05 01:45:35 26 4
gpt4 key购买 nike

我遵循了使用包“rgl”进行 3D 可视化的教程 here

因此,我能够使用“虹膜”数据绘制 3D 散点图,并在 95% 的数据点周围创建一个椭圆体:

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)

我知道与数据集的其余部分相比,前 50 个数据点属于不同的总体,因此以不同的方式为它们着色,并用两个椭圆体覆盖它们:

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)

虽然可以清楚地区分两个种群,但椭圆体相互接触。因此,椭圆体不是数据点的良好视觉表示。在 2D 绘图中,我更愿意使用环绕所有数据点的多项式,但在 3D 中,像凸包这样的东西应该足够了,即由三角形区域组成的多面体,每个三角形区域组合三个外部数据点。

我认为在“geometry”包中使用 QuickHull 算法的函数 convhulln() 会有所帮助,但我无法使用它。

有人知道如何在 rgl 图中描绘这样一个凸包吗?是否也可以使用 plot3D 包执行此操作,因为有一个很棒的教程 here我可以用我自己的数据制作漂亮的图。

我“只是”一名将 R 用于科学的生物学家,而不是数学家或 R 程序员,所以请为我解释您的解决方案。非常感谢。

最佳答案

嘿,在这里找到了答案:

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)

在你做了上面的之后我添加了这个:

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)

关于r - 在 3D 散点图中绘制凸包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41145959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com