Как анимировать точки с помощью gridSVG векторизованным способом? - PullRequest
2 голосов
/ 21 декабря 2011

Я начинаю изучать, как использовать пакет gridSVG для создания анимированных графиков SVG. В качестве теста я хочу анимировать набор точек, переходя от стартовых позиций к финишным. Пример в значительной степени основан на тех, что указаны в первой виньетке пакета .

Сначала некоторые данные:

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. Это работает, но кажется неуклюжим & ndash; должен быть векторизованный способ сделать это.

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")

Могу ли я анимировать несколько точек внутри одного гроба или иначе анимировать точки без петли?

1 Ответ

2 голосов
/ 21 декабря 2011

Это работает для меня, используя 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
)

Вы указали идентификаторы для двух точек, а не для двадцати.Мое прочтение виньетки заключается в том, что для анимации нескольких гробов с одним значением x на гроб вам нужно только указать идентификатор.

...