2011-12-21 28 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 
) 

你被指定ID的兩點,而不是二十歲。我對這個小插曲的讀法是,對於每個grob用單個x值動畫多個grob,您只需要指定id。

+0

啊,是的,我知道它必須簡單。謝謝。 – 2011-12-21 17:38:18