我在使用 rgl 3d 绘图包时遇到一些问题。
\n\n我正在尝试绘制一些线段。我的数据排列在一个名为“标记”的数据框中,有六列,一列对应起始 x、y 和 z 值,一列对应结束 x、y 和 z 值。
\n\nstartX startY startZ endX endY endZ\n69.345 45.732 20 115 39.072 1.92413\n80.270 38.480 30 175 44.548 0.36777\n99.590 33.596 20 175 35.224 0.06929\n32.120 41.218 20 115 39.294 2.81424\n11.775 37.000 30 175 35.890 1.38047\n76.820 44.104 22 115 44.992 4.14674\n85.790 23.384 18 115 36.112 0.40508\n80.040 17.464 20 175 31.080 2.59038\n103.615 38.850 22 115 39.220 3.18201\n41.200 31.006 30 175 36.260 3.48049\n88.665 43.956 30 115 39.738 0.50635\n109.365 23.976 20 175 33.374 3.99750\nRun Code Online (Sandbox Code Playgroud)\n\n这应该是小菜一碟。只需将这些值提供给segment3d()命令,我就应该得到我想要的图。只是我无法弄清楚如何正确地将相应的开始和结束对传递到segment3d()中。
\n\n我已经尝试了几乎所有可能的方法($ 表示法、索引、连接、使用循环、apply 和 sapply 等),包括阅读文档。这太棒了,它对于参数 x、y 和 z 说:“定义坐标的任何合理方式都是可以接受的。” 呃...它确实让您参考 xyz.coords 实用程序。
\n\n所以我查看了该文档。我想我明白它的作用;我什至可以用它来标准化我的数据,例如
\n\nstarts <- xyz.coords(markers$startX, markers$startY, markers$startZ)\n\nends <- xyz.coords(markers$endX, markers$endY, markers$endZ)\nRun Code Online (Sandbox Code Playgroud)\n\n但我仍然不确定如何处理这两个列表。
\n\nsegments3d(starts, ends)\nsegments3d(starts + ends) \nsegments3d((starts, ends), (starts, ends), (starts, ends))\nsegments3d(c(starts, ends), c(starts, ends), c(starts, ends))\nsegments3d(c(starts$x, ends$x), c(starts$y, ends$y), c(starts$z, ends$z))\nRun Code Online (Sandbox Code Playgroud)\n\n我的意思是我知道为什么上面的方法不起作用。我基本上只是在这一点上尝试一些事情,因为这让我感觉非常愚蠢,就像有一些明显的\xe2\x80\x94我的意思是面部手掌水平明显\xe2\x80\x94I\丢失了。
\n\n我浏览了 rgl 文档本身寻找一个例子,我发现他们以任何类似于我正在尝试做的方式使用segment3d()的唯一地方,他们使用了我上面尝试过的“+”符号。基本上,他们构建了 2 个矩阵,并将第二个矩阵添加到第一个矩阵中。
\n像这样的东西应该有效。
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")
Run Code Online (Sandbox Code Playgroud)

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