【问题标题】:Creating animation in R在 R 中创建动画
【发布时间】:2013-07-16 22:05:12
【问题描述】:

我正在研究在 R 中创建动画的可能性。{Animation} 包似乎主要是用于 ffmpeg 和 imagemagick 的 R 平台。我发现创建单个图像帧的唯一参考是将plot() 嵌套在循环中。但是,鉴于png() 渲染器的速度性能不佳,尤其是对于包含地图对象的绘图,这似乎是一个难以实现的缓慢过程,用于生成更复杂的绘图 - 例如:

library(maptools)
data(wrld_simpl)    
starttime = Sys.time()
for(i in 1:10){
  png(paste('frames/', i, '.png', sep=''))
  plot(wrld_simpl, col='grey85', bg = 'white', border='white')
  points(sample(-180:180, 50), sample(-90:90, 50), col='red', pch=16, cex=2)
  title('poxy map')
  dev.off()
}
print(Sys.time() - starttime)

产生 10 帧并且:

Time difference of 9.763794 secs

我不明白为什么 R 的渲染速度如此之慢 - 在这个速度下,以 25fps 的速度渲染一个 2 分钟的视频需要 45 分钟左右,这对于这个相对简单的地图示例来说似乎很慢。用apply 包裹也不会更快。有谁知道更有效地包装plot 的方法,或者在渲染不变的元素后中途保存绘图?

【问题讨论】:

  • 虽然我刚刚发现this 所以我的问题可能是重复的。
  • plot(wrld_simpl) 实际上正在绘制很多段...您可能希望以某种方式将其转换为栅格图层; rasterImage 在分辨率不错的情况下应该效率更高。
  • 很公平。我只是认识到重新加载它仍然有很多重复。其他地方的评论表明ggplot2::ggsave 是实现这一目标的一种方法,我将对此进行研究。
  • ggplot2 会比基本图形慢得多,我估计,而且 ggsave 只是 png(); dev.off() 的包装,所以它也会更慢。
  • 您可以使用grid.rasterrasterImage 一样快,希望@baptiste 结合animationgrid.raster 取消删除他的答案。

标签: r animation


【解决方案1】:

将地图绘制为分辨率刚好足够的图像应该比 SpatialPolygonsDataFrame 的 plot 方法更有效。

require(maps) # save the world
png("world.png", width=500, height=200)
map("world", col="grey90", fill=TRUE, border="grey90",  mar=c(0,0,0,0))
dev.off()

library(png); library(grid)
img = readPNG("world.png") 

animation::saveGIF( {
  for( ii in 1:100) {
    grid.newpage()
    grid.raster(img)
    grid.points(default.units="npc")
  }
  }, ani.height=200, ani.width=500)

【讨论】:

  • 如果您认为可以脱离基本图形,这很有用。我不确定。但我想知道animation 是否可以利用其 imageMagick 将“数据”图像覆盖在底图上,这样会更有效吗? This technique 看起来很有希望。
  • 在基本图形中同样有效,我只是更喜欢网格。但是,是的,如果你不需要轴等,imagemagick 会更好。 (动画现在可以在我的浏览器中运行,多么奇怪……)
猜你喜欢
  • 2021-11-29
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 2012-04-27
相关资源
最近更新 更多