我在使用 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
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           7213 次  |  
        
|   最近记录:  |