将 3d 形状添加到现有的 rgl 对象:alphashape3d

Add a 3d shape to an existing rgl object : alphashape3d

我使用 'vegan' 包中的 metaMDS() 对物种数据集进行了排序分析。我使用了不止一个维度,所以我认为在 3d 图中显示其中三个维度会很好。 'vegan' 包有一些 3d 功能,但结果不是很清楚。它可以使用 orglspider() 函数显示此 "spider" ,这很好但仍然不是很清楚。我更喜欢 'ordihull' 之类的东西,而不是 3d 图。使用 'alphashape3d' 包我可以完成这项工作。它允许我完全按照我的需要绘制 3d 形状。问题是我需要在同一帧中绘制其中的 3 个形状。我试过 "add=T" 但这不起作用。我想我可能不得不改变第二个和第三个形状的调用方式,但我不知道该怎么做。这是我迄今为止尝试过的示例:

### Load the packages
require(vegan)
require(alphashape3d)

### Create some data
a <- c(0.5654292, 0.1960973, 0.0000000, 0.2536315, 0.1960973, 0.4658166, 0.3315565, 0.6865024, 0.7044823, 0.4385855)
b <- c(0.7093823, 0.2409255, 0.3269156, 0.0000000, 0.0000000, 0.3269156, 0.0000000, 0.0000000, 0.0000000, 0.4625978)
c <- c(0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.1022538, 0.4618177, 0.0000000, 0.0000000, 0.0000000)
d <- c(0.00000000, 0.16692171, 0.00000000, 0.22649864, 0.09400543, 0.42456471, 0.79331157, 0.72986751, 0.93837435, 0.65106335)
loc <- c("U", "U", "U", "A", "A", "U", "A", "A", "A", "U")

data <- data.frame(a,b,c,d)

#### Run the mds analysis to obtain the points that should be plotted
mdsB <- metaMDS(data, distance = "bray", autotransform = FALSE, trace = 0,k=3)

### Split the points in the mds object up into two groups
mdsBA <- mdsB
mdsBU <- mdsB

mdsBA$points <- mdsBA$points[which(loc=='A'), ]
mdsBU$points <- mdsBU$points[which(loc=='U'), ]

### Create the 3d shape just like the ordihull function does for 2d shapes
ashape3d.A <- ashape3d(unique(as.matrix(mdsBA$points[,1:3])), alpha = 1.19)
ashape3d.U <- ashape3d(unique(as.matrix(mdsBU$points[,1:3])), alpha = 1.19)

### plot the first shape and try to add the second one. 
plot(ashape3d.A,bycom=TRUE,tran=0.2,shininess=0, col="lightgoldenrod")
plot(ashape3d.U,bycom=TRUE,tran=0.2,shininess=0, col="lightgoldenrod", add=T)

我可能应该等待发布我的问题,因为我自己找到了答案。我通过使用不同的包来创建 add=T 部分实际起作用的凸包解决了这个问题。我使用 "geometry" 包如下:

library("geometry")
A <- mdsBA$points[,1:3]
F <- mdsBU$points[,1:3]

A.surf <- t(convhulln(A))
U.surf <- t(convhulln(U))

rgl.triangles(A[A.surf,1],A[A.surf,2],A[A.surf,3],col="lightgoldenrod",alpha=0.5, add=T)
rgl.triangles(U[U.surf,1],U[U.surf,2],U[U.surf,3],col="lightgoldenrod",alpha=0.5, add=T)