提问者:小点点

在R中创建动画


我正在研究在R中创建动画的可能性。animation}包似乎主要是一个用于ffmpeg和ImageMagick的R平台。我找到的创建单个图像帧的唯一参考是将嵌套在循环中。但是,由于呈现器的速度性能较差,对于生成更复杂的绘图,这似乎是一个不可行的缓慢过程,特别是对于包含地图对象的绘图,例如:

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分钟左右,这对于这个相对简单的地图示例来说似乎很慢。用包装也不会更快。有没有人知道一种更有效地包装的方法,或者在呈现不变元素后中途保存一个绘图的方法?


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