在 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 值?的主要内容,如果未能解决你的问题,请参考以下文章