使用RGL在R中绘制3d线段

时间:2014-11-10 21:55:41

标签: r 3d rgl

我在应用rgl 3d图形包时遇到了一些问题。

我试图绘制一些线段。我的数据被安排在一个名为' marker'的数据框中。具有六列,一个用于每个起始x,y和z值,一个用于每个结束的x,y和z值。

startX  startY startZ endX   endY    endZ
69.345  45.732     20  115 39.072 1.92413
80.270  38.480     30  175 44.548 0.36777
99.590  33.596     20  175 35.224 0.06929
32.120  41.218     20  115 39.294 2.81424
11.775  37.000     30  175 35.890 1.38047
76.820  44.104     22  115 44.992 4.14674
85.790  23.384     18  115 36.112 0.40508
80.040  17.464     20  175 31.080 2.59038
103.615 38.850     22  115 39.220 3.18201
41.200  31.006     30  175 36.260 3.48049
88.665  43.956     30  115 39.738 0.50635
109.365 23.976     20  175 33.374 3.99750

这应该是小菜一碟。只需将这些值提供给segment3d()命令,我就可以得到我想要的图。只有我无法弄清楚如何正确地将相应的起始和结束对传递到segment3d()。

我已经尝试了所有可能的事情($ notation,索引,连接,使用循环,应用和sapply等),包括阅读文档。它很好,它用于参数x,y和z:"任何合理的方法来定义坐标都是可以接受的。"呃......它的确引用了xyz.coords实用程序。

所以我查了那份文件。我想我明白它的作用;我甚至可以用它来标准化我的数据,例如。

starts <- xyz.coords(markers$startX, markers$startY, markers$startZ)

ends <- xyz.coords(markers$endX, markers$endY, markers$endZ)

但是我还不确定如何处理这两个列表。

segments3d(starts, ends)
segments3d(starts + ends) 
segments3d((starts, ends), (starts, ends), (starts, ends))
segments3d(c(starts, ends), c(starts, ends), c(starts, ends))
segments3d(c(starts$x, ends$x), c(starts$y, ends$y), c(starts$z, ends$z))

我的意思是我知道为什么以上都不行。我基本上只是在尝试这一点,因为这让我觉得非常愚蠢,就像有一些明显的东西 - 我的意思是facepalm级别显而易见 - 我很遗憾。

我浏览了rgl文档本身寻找一个示例,我发现他们使用segment3d()的方式与我尝试做的任何方式相似,他们使用了&#39; +&# 39;我在上面试过的符号。基本上他们构建了2个矩阵,并将第二个矩阵添加到第一个矩阵中。

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效。

library(rgl)
open3d(scale=c(1/5,1,1))
segments3d(x=as.vector(t(markers[,c(1,4)])),
           y=as.vector(t(markers[,c(2,5)])),
           z=as.vector(t(markers[,c(3,6)])))
axes3d()
title3d(xlab="X",ylab="Y",zlab="Z")

enter image description here

问题是segments3d(...)成对地取x(和y和z)值 。所以第1-2行是第一段,第3-4行是第二段,等等。你需要交错,例如$startx$endx等。上面的代码就是这样做的。

答案 1 :(得分:0)

用于创建数据集的代码:

markers <- data.frame(startX = c(69.345, 80.270, 99.590, 32.120, 11.775, 76.820, 85.790, 80.040, 103.615, 41.200, 88.665, 109.365), startY = c(45.732, 38.480, 33.596, 41.218, 37.000, 44.104, 23.384, 17.464, 38.850, 31.006, 43.956, 23.976), startZ = c(20, 30, 20, 20, 30, 22, 18, 20, 22, 30, 30, 20), endX = c(115, 175, 175, 115, 175, 115, 115, 175, 115, 175, 115, 175), endY = c(39.072, 44.548, 35.224, 39.294, 35.890, 44.992, 36.112, 31.080, 39.220, 36.260, 39.738, 33.374), endZ = c(1.92413, 0.36777, 0.06929, 2.81424, 1.38047, 4.14674, 0.40508, 2.59038, 3.18201, 3.48049, 0.50635, 3.99750))