2016-12-14 15 views
1

Я следовал учебник по 3D визуализации с использованием пакета «RGL» herePicture Выпуклая оболочка в 3D Scatter Plot

Так что я был в состоянии нарисовать 3D Scatter Plot с данными «ИРИС» и создать эллипсоид окружающих 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-графике я предпочел бы использовать полиномиальный whitch, окружающий все точки данных, но в 3D что-то вроде выпуклой оболочки должно быть адекватным, то есть многогранником, состоящим из трехугольных областей, каждый из которых объединяет три внешних точки данных.

Я думаю, что функция convhulln(), использующая алгоритм QuickHull в «геометрии» пакета, была бы полезна, но я не могу это использовать.

Есть ли у кого-нибудь идея, как изобразить такую ​​выпуклую оболочку на участке rgl? Возможно ли это сделать с пакетом plot3D, так как есть большой учебник here, который я мог бы использовать, чтобы сделать красивый сюжет с моими собственными данными.

Я «единственный» биолог, использующий R для науки, а не математик или программист R, поэтому, пожалуйста, объясните свое решение для меня. Большое спасибо.

+0

Вы пробовали УПАКОВКИ R геометрии? если у вас есть проблемы с этим, я могу помочь –

+0

Да, я попробовал. Я думаю, функция convhulln() может быть полезна, но я не смог включить результат в график rbl или plot3D. «convhulln (cbind (x, y, z))» дает матрицу, но с очень большими целыми значениями выше, чем у cbind (x, y, z). Так что либо что-то не работает, либо я не понимаю выход. – ossesso

ответ

1

Эй узнал ответ здесь:

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) 
+0

О, спасибо большое! Это именно то, что я искал, и он отлично работает с моими собственными данными. – ossesso