在 R 中,如何随时间(3D 或动画)绘制 x、y 值?

Posted

技术标签:

【中文标题】在 R 中,如何随时间(3D 或动画)绘制 x、y 值?【英文标题】:In R, how can I plot x,y values over time (3D or animation)? 【发布时间】:2012-10-01 18:08:18 【问题描述】:

我在屏幕上记录了鼠标移动的 X 和 Y 坐标。我也有记录位置的时间。我想绘制这些以显示鼠标如何随时间移动。

这是我的数据框的外观:

      X   Y          Time
1   812 257 1339892810683
2   793 275 1339892810709
3   783 284 1339892810732
4   746 308 1339892810771

我认为准确表示这一点的唯一两种方法是 3D 情节,或本质上表示播放的动画。有人知道如何在 R 中做到这一点吗?或者,关于如何将其可视化的任何其他想法?

【问题讨论】:

也许可以看看googleVis 包... @BenBolker - 谢谢 - 我发布了一个使用 googleVis 工作的代码示例的答案。该 API 非常易于使用。 【参考方案1】:

对于 3D 绘图,我推荐使用 rgl 库。

install.packages("rgl") # if you don't have it
library(rgl)
plot3d(yourData$X,yourData$Y,yourData$Time)

这会给你一个散点图,但我认为你也应该能够让它画线来表示时间。一个很酷的功能是您可以通过拖动鼠标来改变视角。

【讨论】:

它有效。我必须从我的每个时间值中减去 1339892810000 才能使其工作,但结果是可用的。谢谢。【参考方案2】:

如果您想制作动画,则可以使用动画包,或使用 TeachingDemos 包中的tkexamp 函数创建的 GUI 动画控制。您可以使用 plotrix 包中的 color.scale.lines 绘制带有颜色渐变的最后几个点来增强动画效果。

这是一个例子:

library(TeachingDemos)
library(plotrix)

tmpfun <- function(start,numpoints=10) 
    plot(ccc$Lon,ccc$Lat, xlab='Longitute', ylab='Lattitude', type='n')
    to <- min(nrow(ccc), start+numpoints)
    color.scale.lines( ccc$Lon[start:to], ccc$Lat[start:to], 
        c(0.7,0), c(0.7,0), c(0.7,0), colvar=seq_len(numpoints) )


tmplist <- list( numpoints=list('spinbox', init=10, from=1, to=nrow(ccc)),
                 start=list('animate',init=1, from=1, to=nrow(ccc)) )

tkexamp( tmpfun, tmplist )

这是考虑时间的第二个示例:

tmpfun2 <- function(start, dur=120) 
    time <- as.numeric(h2h$Time3)
    fr <- which( time >= start )[1]
    if( is.na(fr) ) fr <- nrow(h2h)-1
    to <- which( time >= start+dur )[1]
    if( is.na(to) ) to <- nrow(h2h)
    plot(h2h$Lon, h2h$Lat, xlab='Longitute', ylab='Lattitude',
     type='n', main=paste('Times',time[fr],'to',time[to]) )
    color.scale.lines( h2h$Lon[fr:to], h2h$Lat[fr:to], 
        c(0.7,0), c(0.7,0), c(0.7,0), colvar=time[fr:to])


tmplist2 <- list( dur=list('spinbox', init=120, from=10, to=1200),
                start=list('animate',init=0, from=0, to=1780, delay=100,
                            resolution=10) )

tkexamp( tmpfun2, tmplist2 )

在任一示例中使用颜色可能会产生更有意义的颜色渐变。

【讨论】:

该解决方案很好地为 X 和 Y 设置动画。但是,它忽略了时间方面。有没有办法在播放中加入时间? 包含时间的一个简单选项是将color.scale.lines 中的colvar 参数更改为您的时间变量。您还可以更改 tmpfun 函数,使其在开始时间和时间间隔而不是点索引上进行子集化。【参考方案3】:

您可以从每个时间实例制作一个情节,将情节保存到一个 gif 文件,并使用像 gifsicle 这样的应用程序从所有实例/情节创建动画。

【讨论】:

【参考方案4】:

根据 Ben Bolker 的建议,我还查看了 googleVis。这可能是最少的工作。我必须添加一个“实体”列以满足动态图表 API 的要求。

df$Entity = rep("Mouse", nrow(df))
library(googleVis)
M <- gvisMotionChart(df, "Entity", "Time",
                 options=list(width=400, height=360))
plot(M)

代码运行良好,即使将 Time 列保留为整数——它不必对应于实际的时间对象。唯一的缺点是代码在浏览器中运行,(显然)没有简单的方法来保存它。

【讨论】:

【参考方案5】:

@Jim,我为插件道歉,但如果您仍在寻找答案,我开发的应用程序正是为此目的而设计的。它被称为popcharts,它仅适用于 Mac。这不是一个免费的应用程序,但请查看该网站,那里有很多 demos 和 tutorials 可用。但基本上,如果您的文件按照您的问题的结构进行结构化,您只需几分钟就可以看到您的数据动画,甚至将其导出为视频。所以我可能不知道如何在 R 中做到这一点,但这会很快完成工作。

【讨论】:

以上是关于在 R 中,如何随时间(3D 或动画)绘制 x、y 值?的主要内容,如果未能解决你的问题,请参考以下文章

3D散点图动画

如何在Gnuplot 5中制作GIF动画

使用 Plotly 绘制动画 3D 曲面图

如何绘制一个框(或圆圈)以强调 R 中图形的特定区域?

unity3d 中如何让一个物体一端固定,另一端随另一物体运动,就像弹簧一样

使用 R 绘制带有等高线图叠加的 3D 曲面图