实时3D散点图

时间:2014-10-15 16:35:43

标签: r matlab plot real-time

我在R工作并拥有以下表格的数据。数据框,其中第一列是人的出生日期,第二列是年龄,第三是死因(自然/疾病/事故),第四是种族,第五是出生时的体重,第六列是出生时的长度。

最终,我想创建一个3D图形的短视频/时间流逝,最后三列为空间维度。视频播放时间对应于收集数据的总时间。当视频播放时,点会以黑点的形式出现在适当的3D位置,之后根据其死因转为蓝/绿/红。

在追求这个想法的过程中,我遇到了this,但它似乎实时地移动轴而不是实时填充图形。我担心这基本上是一项不同的任务。我也看到jfreechart.com对此有用,但我倾向于在R / Matlab中实现这一点,如果它可能在诉诸其他软件之前。最后,我愿意使用/学习完成此任务所需的任何软件。

感谢您抽出宝贵时间!

1 个答案:

答案 0 :(得分:1)

这可以使用R包scatterplot3danimation来完成。后者需要安装ImageMagick

以下是一些代码可以完成您想要做的事情。

require(animation)
require(scatterplot3d)

# Get some example data
n <- 10
dt <- data.frame(birth = rnorm(n, 50, 20),
                 age = sample(1:100, n, replace=TRUE), 
                 cause = sample(1:3, n, replace=TRUE), 
                 race = sample(1:5, n, replace=TRUE),
                 bweight = rnorm(n, 1000, 200),
                 blen = rnorm(n, 300, 20))

# Starting and final timepoint
st <- 1
ft <- 150

# All the timepoints to evaluate
times <- st:ft

# Matrices that show for each timepoint whether a person is alive or dead.
born <- outer(dt$birth, times, "<")
dead <- outer(dt$birth + dt$age, times, "<")

# Matrix is 0 for not yet born, 1 for living, 2 for dead.
status <- born + dead

# If dead, this contains the status of the cause.
deadcause <- matrix(dt$cause, nc=length(times), nrow=n) * dead + born

# Function to get animations
anim <- function(dt, times) {
  for(i in seq_along(times)) {

    # Remove those not yet born.
    dtcur <- dt * born[, i]

    scatterplot3d(x=dtcur$race, 
                  y=dtcur$bweight, 
                  z=dtcur$blen, 
                  color=deadcause[, i],
                  angle = 135, type = "h",
                  main=paste("At time", i),
                  xlim=c(0,5), 
                  ylim=c(0,1500), 
                  zlim=c(0,500))
    animation::ani.pause()
  }
}

# Save the gif to current directory.
saveGIF(expr = anim(dt, times), interval=.1, outdir = getwd())