R保存图像以创建以大量点递增生成的绘图的动画

时间:2012-07-23 11:17:49

标签: r animation graphics plot

我试图根据随时间逐步建立的散点图创建动画。用例是我有一个大约200万个点的数据库,每个点都有时间戳,并希望生成显示特定日期或之前所有点的帧。

在不保存图像的情况下,我可以通过先调用plot(),然后使用for points()函数逐渐绘制每个连续日数据的for循环来完成此操作。

当我尝试使用下面的代码保存图像时,我收到错误" plot.new尚未调用"。据我了解,保存图像需要dev.off(),但这也会关闭正在绘制的设备。有办法解决这个问题吗?由于数据的大小,不得不重新绘制每个帧的数据。

plot(info$lon, info$lat, xlim=c(0,30), ylim=c(30,60))
for (i in c(1:length(allDates))){
    filename=paste(sprintf('%05d', i), ".png", sep="")  
    png(filename=fileName)
    # (code that gets the data for a particular date via a database query)
    points(info$lon, info$lat, cex=0.1)
    dev.off()
}

更新 @ roman-lustrik关于ggsave()的评论是我正在寻找的,并产生以下代码:

plotObj = ggplot(...) + geom_point() + xlim(...) + ylim(...)
for (i in c(1:length(allDates))){
    filename=paste(sprintf('%05d', i), ".png", sep="")  
    # (code that gets the data for a particular date via a database query)
    plotObj = plotObj + geom_point(data=info, aes(x=lon, y=lat), size=0.5)
    print(plotObj)
    ggsave(filename=filename, width=6, height=6)
}

然而,这仍然有点慢,所以我目前快速渲染图像的解决方案是使用类似于原始代码的代码,但我只使用plot()来渲染具有单个日期数据的帧(使用透明背景)。为了逐步堆叠图像,我然后使用bash脚本使用imagemagick convert -composite命令将两个图像混合在一起。然后将此混合图像与下一个日期的图像混合,依此类推,直到最终图像显示所有数据:

#!/bin/bash
for i in $files
do
    convert $prevFile $i -composite ./stackedImages/$i
    prevFile=./stackedImages/$i
done

1 个答案:

答案 0 :(得分:1)

如果我理解了,你想要得到几个包含不同点数的png文件,以及由plot(info$lon, info$lat, xlim=c(0,30), ylim=c(30,60))创建的第一个点。

你可以这样做:

temp1 <- info$lon
temp2 <- info$lat
for (i in c(1:length(allDates))){
        filename=paste(sprintf('%05d', i), ".png", sep="")  
        png(filename=fileName)
        plot(temp1, temp2, xlim=c(0,30), ylim=c(30,60))
        # (code that gets the data for a particular date via a database query)
        points(info$lon, info$lat, cex=0.1)
        dev.off()
        temp1 <- c(temp1,info$lon)
        temp2 <- c(temp2,info$lat)
}