计算表面下的体积

时间:2013-05-05 06:09:14

标签: r

我使用wireframe函数创建了一个3D图(表面)。我想知道是否有任何函数可以计算3D图表面下的体积? 以下是我的数据示例以及用于创建3D(曲面)图的wrieframe语法:

x1<-c(13,27,41,55,69,83,97,111,125,139)
x2<-c(27,55,83,111,139,166,194,222,250,278)
x3<-c(41,83,125,166,208,250,292,333,375,417)
x4<-c(55,111,166,222,278,333,389,445,500,556)
x5<-c(69,139,208,278,347,417,487,556,626,695)
x6<-c(83,166,250,333,417,500,584,667,751,834)
x7<-c(97,194,292,389,487,584,681,779,876,974)
x8<-c(111,222,333,445,556,667,779,890,1001,1113)
x9<-c(125,250,375,500,626,751,876,1001,1127,1252)
x10<-c(139,278,417,556,695,834,974,1113,1252,1391)

df<-data.frame(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10)
df.matrix<-as.matrix(df)

wireframe(df.matrix,
      aspect = c(61/87, 0.4),scales=list(arrows=FALSE,cex=.5,tick.number="10",z=list(arrows=T)),ylim=c(1:10),xlab=expression(phi1),ylab="Percentile",zlab=" Loss",main="Random Classifier",
      light.source = c(10,10,10),drape=T,col.regions = rainbow(100, s = 1, v = 1, start = 0, end = max(1,100 - 1)/100, alpha = 1),screen=list(z=-60,x=-60))

注意:我的真实数据是100X100矩阵

谢谢

2 个答案:

答案 0 :(得分:3)

您要向wireframe提供的数据是一个值网格。因此,对近似的任何下伏表面的体积的估计是网格值乘以网格单元区域的总和。这就像添加直方图条的高度来获得直方图中的值的数量。

我在你的数据上看到的这个问题是,单元格区域将以奇数单位表示 - 一个轴上的百分位数,另一个轴上的phi具有未知单位,因此您的音量将达到具有单位的损失乘以百分位单位乘以phi的单位。

如果你想在完全相同的网格上比较类似物的体积,这不是问题,但如果你有不同网格上的表面(不同的phi值或不同的百分位数),那么你需要小心。 / p>

现在,注意到wireframe不像3d直方图那样绘制(看起来像方形塔块),这给了我们另一种估计音量的方法。您的10x10矩阵绘制为9x9平方。将每个正方形划分为三角形,然后计算192个右截断三角形棱柱的体积(我认为这就是它们 - 它们是等边三角形棱柱,具有直角和一个倾斜端)。那个公式应该在某个地方。可能基本区域的高度与三角形的质心高度相等。

我想也许这会在光栅包中,但事实并非如此。有计算表面积而不是体积的代码!我确信光栅维护者很乐意为此提供一些代码!

答案 1 :(得分:1)

如果这些点是任意的(即,不遵循平滑函数),看起来你正在寻找围绕这些点的凸包(最小表面)的体积。一个帮助您计算的包是alphashape3d

你需要一个3列的坐标矩阵来形成正确的对象类型才能进行计算,但它似乎很简单。