我遵循教程,使用" rgl"软件包
的软件包可视化因此,我能够用"虹膜"数据绘制一个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图中,我更希望使用polynom Whinthitch酸化所有数据点,但是在3D中,诸如凸船体之类的东西应该是足够的,即由三角形区域组成的多面体,每个三角形区域结合了三个外部数据点。
我认为使用QuickHull算法"几何"中的QuickHulln()功能会有所帮助,但我无法使用。
有人知道如何在RGL图中描绘出这样的凸面船体吗?是否也可以使用Plot3D软件包来执行此操作,因为这里有一个很棒的教程,我可以用我自己的数据来制作一个美丽的绘图。
我是一位使用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)