如何创建地理空间/时间数据的动画

时间:2013-06-19 06:45:36

标签: r animation time geo

我有一组数据,其中包含大约150,000个800个科目的观察结果。每个观察具有:主题ID,纬度,经度以及主题在那些坐标处的时间。数据涵盖24小时。

如果我一次绘制所有数据,我只会得到一个blob。是否有人能够给我一些关于如何为这些数据设置动画的提示,以便我可以观察到主体的路径随时间的变化?

我已经阅读过时空小插曲,但我并不完全确定它会做我想要的。在这一点上,我花了很多时间在谷歌搜索,但没有真正想出任何符合我需要的东西。

任何提示和指示都非常感谢!

2 个答案:

答案 0 :(得分:3)

这是我第一次使用animation包。这比我预想的要容易,特别是saveHTML真是太棒了。在这里我的场景(即使我认为我的R代码会更清楚:)

  1. 我生成一些数据
  2. 我为所有人绘制基本情节作为背景情节。
  3. 我重塑数据以获得宽格式,我可以在每个人的当前和下一个位置之间绘制箭头。
  4. 我循环了几个小时,生成了许多情节。我把llop放在强大的saveHTML函数中。
  5. 你得到一个带有漂亮动画的html文件。我在这里展示了一个中间情节。
  6. enter image description here

    这是我的代码:

    library(animation)
    library(ggplot2)      
    library(grid)
    ## creating some data of hours 
    N.hour <- 24
    dat <- data.frame(person=rep(paste0('p',1:3),N.hour),
                      lat=sample(1:10,3*N.hour,rep=TRUE),
                      long=sample(1:10,3*N.hour,rep=TRUE),
                      time=rep(1:N.hour,each=3))
    
    
    # the base plot with
    base <- ggplot() + 
      geom_point(data=dat,aes(x=lat, y=long,colour = person),
                 size=5)+ theme(legend.position = "none") 
    
    
    ## reshape data to lat and long formats
    
    library(plyr)
    dat.segs <- ddply(dat,.(person),function(x){
      dd <- do.call(rbind,
               lapply(seq(N.hour-1),
                  function(y)c(y,x[x$time %in% c(y,y+1),]$lat,
                       x[x$time %in% c(y,y+1),]$long)))
      dd
    
    })
    colnames(dat.segs) <- c('person','path','x1','x2','y1','y2')
    
    # a function to create the animation
    oopt <- ani.options(interval = 0.5)
    saveHTML({
      print(base)
      interval = ani.options("interval")
      for(hour in  seq(N.hour-1)){
        # a segment for each time
        tn <- geom_segment(aes(x= x1, y= y1, xend = x2,
                            yend = y2,colour = person), 
                           arrow = arrow(), inherit.aes = FALSE,
                           data =subset(dat.segs,path==hour))
    
        print(base <- base + tn)
        ani.pause()
      }
    }, img.name = "plots", imgdir = "plots_dir", 
       htmlfile = "random.html", autobrowse = FALSE, 
        title = "Demo of animated lat/long for different persons",
        outdir=getwd())
    

答案 1 :(得分:1)

你的问题有点模糊,但我会分享我过去做过这种动画的方式。

  1. 创建一个绘制一个时间片的所有主题位置的函数:

    plot_time = function(dataset, time_id) {
        # make a plot with your favorite plotting package (e.g. `ggplot2`)
        # Save it as a file on disk (e.g. using `ggsave`), under a regular name, 
        # frame001.png, frame002.png, see sprintf('frame%03d', time_index)
    }
    
  2. 在每个时间片上调用此函数,例如使用lapply

    lapply(start_time_id:stop_time_id, plot_time)
    

    导致名为frame001framexxx的硬盘驱动器上的一组图形文件。

  3. 使用工具将这些帧渲染为电影,例如使用ffmpeg,请参阅for example

  4. 这是一个常规工作流程,已在animation包中实现(感谢提醒我@mdsummer)。您可以利用该包来获取动画。