2014-10-15 5 views
1

Я работаю в R и имею данные, следующие формы. Кадр данных, где первый столбец - дата рождения человека, второй - возраст в годах, третий - причина смерти (естественный/болезнь/несчастный случай), четвертый - раса, пятый - вес при рождении, а шестой - длина при рождении.3D plot plot in real time

В конечном счете, я хочу создать короткое видео/временную разметку трехмерного графика с тремя последними столбцами в качестве пространственных измерений. Время воспроизведения видео соответствует общему времени, в течение которого собираются мои данные. По мере воспроизведения видео точки попадают в соответствующее 3D-положение в виде черных точек, а затем становятся синими/зелеными/красными в зависимости от их причины смерти.

Преследуя эту идею, я наткнулся на this, но, похоже, сдвигает ось в реальном времени и не заполняет график в реальном времени. Я боюсь, что это принципиально другая задача. Я также видел, что jfreechart.com полезен для этого, но я предпочитаю выполнить это в R/Matlab, если это возможно, прежде чем прибегать к другому программному обеспечению. В конце концов, я открыт для использования/изучения любого программного обеспечения, необходимого для достижения этого.

Спасибо, что нашли время!

+0

Чтобы сделать то, что показано на видео, возможно, возможно, в 'Matlab' (и хотя я менее знаком с' R', я уверен, что это также возможно). Не нужно изучать новый язык только для этой задачи. Вы должны попробовать что-то на том языке, который вам наиболее удобен для начала, и опубликовать свой результат здесь, а затем сообщество может помочь вам его улучшить. – Hoki

ответ

1

Это может быть выполнено с использованием пакетов R scatterplot3d и animation. Последнее требует установки 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())