質問: ### 前提・実現したいこと JSONファイルからセンサデータを抜き出して、CSVファイルに格納したデータファイルがあります。 1000行ぐらいのデータで構成されていて、1列目には時間、2列目には粒子のX座標、3列目にはy座標が入力されています。 最初、matplotlibにてX軸は時間、Y軸は粒子のx座標を一度にプロットしました。普通の2次元グラフです。 上司から、粒子の動きを時間とともに動画でみてみたい、ということで、X軸にx座標、Y軸にy座標のグラフを作り、対象となる粒子を時間と共に、グラフ上でアニメーションにすれば上司の要望に応えられる、と思いました。 やりたいのは、CSVのデータを時間とともに順番に行を読んでいき、粒子の動きの軌跡を時間とともにプロットしたいです。徐々に行を読んで、古い行のデータ(古い軌跡)は徐々に消していく、というアニメーションが出来ればいいのですが。 python初心者なので、そんな高度なプログラムが思い浮かばず、足踏みしています。。 どんな流れで処理していくのがシンプルでしょうか? よろしくお願いいたします。
回答: 粗削りなロジックですが組んでみました。詳細はコード内のコメントを参照ください。 ``` import matplotlib.pyplot as plt import matplotlib.animation as animation import math fig, ax = plt.subplots() # 前処理としてデータ読込と # 時間を先頭からの累積経過時間に変換する処理が必要 # テストデータの生成 x,y,t = ],[],[] for i in range(1000): t.append(i*10) # 先頭からの累積経過時間[msec] # 適当な周回運動 x.append(math.cos(i/25.0)*10) y.append(math.sin(i/25.0)*10) DELTA_T = 33 # アニメーション間隔[msec] FRAMES = t[-1] // DELTA_T # 必要な総フレーム数 pos = 0 # 描画時点の時間位置 def animate(i): # 描画時点の時間まで進める global pos while t[pos] < i*DELTA_T: pos += 1 ax.cla() ax.set_xlim(-20, 20) ax.set_ylim(-20, 20) N_PLOT = 5 # 描画点の数 # 描画時点からの時刻基準で未来方向の点群を描画してしまうけど、まあいいか... ax.plot( x[pos:pos+N_PLOT], y[pos:pos+N_PLOT],"o") ani =animation.FuncAnimation(fig, animate, frames=FRAMES, interval=DELTA_T) ani.save('ret.mp4', writer='ffmpeg') ``` ![イメージ説明