【问题标题】:Make a 3D rendered plot of time-series制作时间序列的 3D 渲染图
【发布时间】:2011-11-16 14:10:47
【问题描述】:

我有一组 3D 坐标(以下 - 仅针对 3D 空间中的一个点):

x <- c(-521.531433, -521.511658, -521.515259, -521.518127, -521.563416, -521.558044, -521.571228, -521.607178, -521.631165, -521.659973)
y <- c(154.499557, 154.479568, 154.438705, 154.398682, 154.580688, 154.365189, 154.3564, 154.559189, 154.341309, 154.344223)
z <- c(864.379272, 864.354675, 864.365479, 864.363831, 864.495667, 864.35498, 864.358582, 864.50415, 864.35553, 864.359863)
xyz <- data.frame(x,y,z)

我需要使用 3D 渲染制作该点的时间序列图(这样我可以旋转图等)。该图将在时间上可视化上述点的轨迹(例如以实线的形式)。我使用'rgl' packageplot3d 方法,但我无法绘制时间序列(下面,仅从时间序列中的第一帧绘制一个点):

require(rgl)    
plot3d(xyz[1,1],xyz[1,2],xyz[1,3],axes=F,xlab="",ylab="",zlab="") 

我找到了this post,但它并不能真正处理实时渲染的 3D 绘图。我将不胜感激任何建议。谢谢。

【问题讨论】:

  • 您查看过rgl 包中的?movie3d 吗?我不太清楚你所说的“实时”是什么意思——你的意思是帧速率应该与收集数据的速率完全匹配(即轨迹在真正收集 1 秒的点之间向前移动 1 秒分开),或者只是您想显示数据的电影/动画,其中电影时间与数据收集时间成正比(但不一定相同)?
  • 谢谢 Ben,“实时”这个词有点令人困惑,所以我把它从我的问题中删除了。我的意思是我想要渲染 3D 绘图以便我可以旋转它等,而不是我需要播放任何序列。很抱歉造成混乱。

标签: r 3d time-series rgl


【解决方案1】:

如果您阅读help(plot3d),您可以了解如何绘制线条:

require(rgl)    
plot3d(xyz$x,xyz$y,xyz$z,type="l")

这就是你想要的吗?

【讨论】:

  • 我知道这个选项,但这不是我想要的。这个想法是,“xyz”中的每一行都定义了一个时间步长,x、y、z 列定义了特定时间步长的点位置。所以我需要第一步成为一个点,所有其他步骤形成一条线,显示这个时间点的位置。
  • type="l" 画的线不是单线显示时间点的位置吗?你真的想要一个移动的点吗?
  • 好的,问题是它似乎不适用于大型数据集,例如动作捕捉数据。我上传了样本here。这是来自两个演员的动作捕捉数据。单个坐标由三列编码(总共 90 列,单个参与者 45 列,即每个参与者 15 个点)。我将 xyz 提取到单独的帧中,但我无法使用 type="l" 或您发布的 'ts' 函数绘制 3D 时间序列。
  • 好吧,真的不知道你在用你的数据做什么,但如果我这样做 bob=read.table("Bob12.txt");ts(bob[,1:3],0)我得到了前 3 个坐标的不错踪迹。我唯一的问题是当 R 正在做事或睡觉时你不能旋转视图..
  • 谢谢 - 我需要玩一下你的 'ts' 功能,但这可能是我问题的答案。为您提供更多背景信息 - 我有两个演员站在一起,互动约 5 秒钟。对于每个演员,我有 15 个标记来描述他们的关节中心的位置。我想查看每个标记的时间序列,但将第一帧保留为一组点 - 这样我就可以可视化运动的动态。
【解决方案2】:

这个怎么样?它使用rgl.pop() 删除点和线并将它们绘制为轨迹 - 更改 sleep 参数以控制速度:

ts <- function(xyz,sleep=0.3){
  plot3d(xyz,type="n")
  n = nrow(xyz)
  p = points3d(xyz[1,])
  l = lines3d(xyz[1,])
  for(i in 2:n){
    Sys.sleep(sleep)
    rgl.pop("shapes",p)
    rgl.pop("shapes",l)
    p=points3d(xyz[i,])
    l=lines3d(xyz[1:i,])
  }
}

【讨论】:

    【解决方案3】:

    解决方案比我想象的要简单,问题是我没有在我的数据上使用as.matrix。当我只是尝试使用plot3d 绘制我的整个数据集时,我收到了错误(list) object cannot be coerced to type 'double'(找到了here 的解决方案)。因此,如果您需要绘制坐标集的时间序列(在我的情况下是两个演员的动作捕捉数据),这是我的完整解决方案(仅适用于下面的数据集!):

    • download example data set
    • 将以上数据读入表格:

      data <- read.table("Bob12.txt",sep="\t")
      
    • 将 XYZ 坐标提取到单独的矩阵中:

      x <- as.matrix(subset(data,select=seq(1,88,3)))
      y <- as.matrix(subset(data,select=seq(2,89,3)))
      z <- as.matrix(subset(data,select=seq(3,90,3)))
      
    • 使用'rgl' package 在漂亮的 3D 渲染图上绘制坐标:

      require(rgl)
      plot3d(x[1:nrow(x),],y[1:nrow(y),],z[1:nrow(z),],axes=F,xlab="",ylab="",zlab="")
      

    你应该得到类似下图的东西(但你可以旋转它等等)——希望你能认识到那里有供人们使用的联合中心。我仍然需要对其进行调整以使其视觉效果更好 - 将第一帧作为一个点(以清楚地看到演员的关节),然后是可见的中断,然后将其余帧作为一条线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 2010-09-30
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多