2011-12-21 4 views
2

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

Во-первых, некоторые данные:

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

я могу обойти это, рисуя каждую точку в своем Grob, используя lapply. Это работает, но кажется неуклюжим – там должен быть векторный способ сделать это.

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

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

ответ

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 
) 

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

+0

Ах да, я знал, что это должно быть просто. Благодарю. –