如何使用gridSVG以矢量化方式为点设置动画?

时间:2011-12-21 16:59:55

标签: r svg r-grid

我开始学习如何使用gridSVG包创建动画SVG图。作为测试,我想要动画一组点,从开始位置移动到完成位置。该示例基于包first vignette中的那些。

首先,一些数据:

n_points <- 20
start <- data.frame(
  x = runif(n_points),
  y = runif(n_points)
)
end <- data.frame(
    x = runif(n_points),
    y = runif(n_points)
)

基本思想似乎是“绘制新页面,添加第一帧的内容,动画,然后保存到SVG”。我的第一次尝试是在同一个地方绘制所有点。我不确定如何告诉grid.animate每个点都需要单独移动。

grid.newpage()
with(start, 
  grid.points(x, y, default.units = "npc", name = "points")
)
grid.animate(
  "points", 
  x = c(start$x, end$x),
  y = c(start$y, end$y)
)
gridToSVG("point_test1.svg")

我可以使用lapply在自己的grob中绘制每个点来绕过这个。这很有效,但感觉很笨 - 应该有一种矢量化的方式。

grid.newpage()
lapply(seq_len(n_points), function(i)
{
  gname = paste("points", i, sep = ".")
  with(start, 
    grid.points(x[i], y[i], default.units = "npc", name = gname)
  )
  grid.animate(
    gname, 
    x = c(start$x[i], end$x[i]),
    y = c(start$y[i], end$y[i])
  )
})
gridToSVG("point_test2.svg")

我也尝试使用animUnit,但我无法弄清楚如何指定id参数。

grid.newpage()
with(start, 
  grid.points(x, y, default.units = "npc", name = "points")
)
x_points <- animUnit(
  unit(c(start$x, end$x), "npc"),
  timeid = rep(1:2, each = n_points),
  id = rep(1:2, n_points)
)        
y_points <- animUnit(
  unit(c(start$y, end$y), "npc"),
  timeid = rep(1:2, each = n_points),
  id = rep(1:2, n_points)
)        
grid.animate(  #throws an error: Expecting only one value per time point
  "points", 
  x = x_points,
  y = y_points
)
gridToSVG("point_test3.svg")

我可以在单个grob中为多个点设置动画,或者在没有循环的情况下为点设置动画吗?

1 个答案:

答案 0 :(得分:2)

这适用于我使用animUnit

grid.newpage()
with(start, 
  grid.points(x, y, default.units = "npc", name = "points")
)
x_points <- animUnit(
  unit(c(start$x, end$x), "npc"),
  #timeid = rep(1:2, each = n_points),
  id = rep(1:20, 2)
)        
y_points <- animUnit(
  unit(c(start$y, end$y), "npc"),
  #timeid = rep(1:2, each = n_points),
  id = rep(1:20, 2)
)        
grid.animate(  #throws an error: Expecting only one value per time point
  "points", 
  x = x_points,
  y = y_points
)

你指的是两个点的id,而不是二十个。我对小插图的阅读是,为每个grob设置一个x值的多个grob动画,你只需要指定id。