2017-05-05 23 views
0

Pythonでmatplotlibを使用している小さなコードで悩んでいます。私はpythonでmatplotlibパッケージを使用してPythonで2台のボックスカーをアニメーション化しようとしていますが、私はanimateの両方の車のx座標を同時に更新することはできません。matplotlibのfuncAnimationへの引数の追加

最小限の作業例を以下に示す:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
import matplotlib.animation as animation 

# Complete length of trajectory 
maxL = 2000 

# Initial positions and velocities of lead and host cars 
xl = 30 
vl = 5 

xh = 0 
vh = 5 

# Step size 
dt = 0.1 

lead = np.matrix([[xl,vl]]) 
host = np.matrix([[xh,vh]]) 

while xl < maxL: 
    xl = xl + vl*dt 
    lead = np.concatenate((lead,[[xl,vl]]), axis = 0) 
    xh = xh + vh*dt 
    host = np.concatenate((host,[[xh,vh]]), axis = 0) 

road_width = 3; 
fig1 = plt.figure(1) 
ax = fig1.add_subplot(111) 
rect_l = patches.Rectangle(
     (lead[0,0], road_width/2), # (x,y) 
     10,   # width 
     1,   # height 
     facecolor = "red", # remove background 
     ) 
rect_h = patches.Rectangle(
      (host[0,0], road_width/2), # (x,y) 
      10,   # width 
      1,   # height 
      facecolor = "blue", # remove background 
     ) 

ax.add_patch(rect_l) 
ax.add_patch(rect_h) 

def init(): 
    plt.plot([0,maxL],[road_width,road_width],'k-') 
    plt.plot([0,maxL],[-road_width,-road_width],'k-') 
    plt.plot([0,maxL],[0,0],'k--') 
    return [] 

#### This works ##### 
def animate(x1): 
    rect_l.set_x(x1) 
    return rect_l, 


plt.axis([0, maxL, -10, 10]) 
plt.xlabel('time (s)') 
plt.ylabel('road') 
plt.title('Car simulation') 
ani = animation.FuncAnimation(fig1, animate, lead[:,0], init_func = init, interval=0.1, blit=False) 

plt.show() 

しかし、私は以下のような何かをしたいです。このコードを実行するとPythonがクラッシュします。

def animate(x1,x2): 
    rect_l.set_x(x1) 
    rect_h.set_x(x2) 
    return rect_l,rect_h, 


plt.axis([0, maxL, -10, 10]) 
plt.xlabel('time (s)') 
plt.ylabel('road') 
plt.title('Car simulation') 
ani = animation.FuncAnimation(fig1, animate, (lead[:,0],host[:,0]), init_func = init, interval=0.1, blit=False) 

plt.show() 

答えて

1

の代わりにプロットするために使用する値は、frames引数にフレーム数を提供することができます。

ani = animation.FuncAnimation(fig1, animate, frames=len(lead)) 

これは0len(lead)の範囲を使用するのと同じですとcurrectフレームの整数でアニメーションを呼び出します。 アニメーション機能内のleadとアレイの両方から適切な値を選択するには、この番号を使用します。

def animate(i): 
    x1 = lead[i,0] 
    x2 = host[i,0] 
    rect_l.set_x(x1) 
    rect_h.set_x(x2) 
+0

ありがとうございました。それは動作します。 – shunyo

関連する問題