2

時間の経過とともに段階的に構築される散布図に基づいてアニメーションを作成しようとしています。ユースケースは、それぞれにタイムスタンプが付いた約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
4

1 に答える 1

1

私が理解していれば、ポイントの数が異なり、最初のポイントが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)
}
于 2012-07-23T12:03:02.133 に答える