時間の経過とともに段階的に構築される散布図に基づいてアニメーションを作成しようとしています。ユースケースは、それぞれにタイムスタンプが付いた約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-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()
、単一の日付のデータを含むフレームをレンダリングするために使用します(透明な背景を使用)。convert -composite
次に、画像を段階的に積み上げるために、imagemagickコマンドを使用して2つの画像をブレンドするbashスクリプトを使用します。このブレンドされた画像は、次の日付の画像とブレンドされ、最終的な画像にすべてのデータが表示されるまで続きます。
#!/bin/bash
for i in $files
do
convert $prevFile $i -composite ./stackedImages/$i
prevFile=./stackedImages/$i
done