我正试图创建一个基于散点图的动画,该散点图是随着时间的推移逐渐构建的。用例是,我有一个大约200万个点的数据库,每个点都有时间戳,并且希望生成显示特定日期或之前所有点的帧。
在不保存图像的情况下,我可以通过首先调用plot()
,然后使用一个for循环来使用points()
函数递增地绘制连续一天的数据。
当我尝试使用下面的代码保存图像时,我会收到一个错误"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 lustik关于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脚本,该脚本使用imagemagik convert -composite
命令将两个图像混合在一起。然后将该混合图像与下一个日期的图像混合,以此类推,直到最终图像显示所有数据:
#!/bin/bash
for i in $files
do
convert $prevFile $i -composite ./stackedImages/$i
prevFile=./stackedImages/$i
done
如果我已经理解了,你想得到几个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)
}