1

物理的な問題を解決するために拡張したい小粒子シミュレーターを始めたばかりですが、それらをアニメートしようとすると問題が発生します。基本的に、選択したランダム分布の種類に応じて、粒子は特定の長さの領域で「振動」します。前の10ステップで、パーティクルの「履歴」を表示したいと思います。

これがコードです

from numpy import *
import matplotlib.pyplot as plt
import pylab
import time

pylab.ion()

N = 10
r = random.randint(-100,100,2*N).reshape(N,2)
line, = plt.plot(r[:,0], r[:,1],'o')

for i in range(100000):
  newdatax = r[:,0] + random.rand(N)
  newdatay = r[:,1] + random.rand(N)
  line.set_ydata(newdatay)
  line.set_xdata(newdatax)
  plt.title("At timestep: %d" %i)
  plt.hold(True)
  plt.draw()
  time.sleep(1.0/30)

私が欲しいのは、ラインの更新でキャンバスをクリアせず、反復ごとに再描画することです。たとえば、10フレーム(反復)ごとにそれを実行することで、パーティクルを視覚的に追跡しやすくなります。

私が実装したい別のことがありますが、それは厳密には必要ではありません。各「o」の周りにボックス(正方形)または円または三角形を描くことは可能ですか?ポイントがそのボックス/円/三角形の中心にくるように?これにより、粒子の追跡がはるかに簡単になります。どの「o」(ポイント)がこのプロパティ(正方形)を取得するかを指定できれば、さらに良いでしょう。

4

1 に答える 1

2

animationモジュールを試してください。この素晴らしいチュートリアルも参照してください。Matplotlibは画像上でアニメーション化します(主に、networkxエッジを描画するアニメーションへの私の答えのコピーと過去)

必要なタイムラグを取得するには、次のような履歴データ構造を設定する必要があります。

from matplotlib import animation

fig = figure()
N = 10
r = random.randint(-100,100,2*N).reshape(N,2)
line, = plt.plot(r[:,0], r[:,1],'o')


lag_len = 10
history_x = np.zeros((N,lag_len))
history_y = np.zeros((N,lag_len))
trails = [plot(hx,hy)[0] for hx,hy in zip(history_x,history_y)]

def update_frame(i):
    frame_num = i
    newdatax = r[:,0] + random.rand(N)
    newdatay = r[:,1] + random.rand(N)
    line.set_ydata(newdatay)
    line.set_xdata(newdatax)
    history_x[:,frame_num%lag_len] = newdatax
    history_y[:,frame_num%lag_len] = newdatay
    for hx,hy,ln_h in zip(history_x,history_y,trails):
         ln_h.set_xdata(hx)
         ln_h.set_ydata(hy)

    plt.title("At timestep: %d" %i)
    plt.hold(True)
    return (line,) + tuple(trails)

anim = animation.FuncAnimation(fig, update_frame, 
                           frames=100, interval=20)

ボックスについては、 Rectanglepylabモードで長方形を描画(add_patch))、およびに渡すオプションの引数を使用しFuncAnimationます。

これは完全ではありません。それ自体にループバックするという奇妙な詳細がいくつかあります(1つのループのフレーム50は、次に通過するときのフレーム50と同じではありません)。履歴内のゼロの束(履歴配列を初期点の10個のコピーになるように初期化することで修正できます)

于 2012-11-20T15:59:19.107 に答える