2017-02-09 20 views
0

私は現在、交通渋滞解析に取り組んでおり、このような紙詰まりのプロットの生成をアニメーション化する方法があるかどうか疑問に思っていました。Matplotlibアニメーションスペース対時間プロット

これらのプロットは図の上端から下端にかけて成長し、各 '行'は時間インスタンスです。横軸は各車両の位置を各点で示し、一定の数値でその速度を示す道路に過ぎません。異なる色を異なる速度に適用すると、特定の道路で渋滞がどのように進化するかを示すプロットが得られます。

私の質問は、私は、このようなプロットを取得する時間に道路の各インスタンスのアニメーションを生成するために、matplotlibのをどのように使用できるか、でしょうか?

プロットは次のようなものです:

私は時間を通じて一定の速度で車と道路をシミュレートしていますので、私は交通渋滞が進化の様子を示すプロットをアニメーション化したいです...

編集:私はすでにやっている明確なものを作るためにいくつかのコードを追加し

import numpy as np 

from matplotlib import pyplot as plt 
from matplotlib import animation, rc 

plt.rcParams['animation.ffmpeg_path'] = u'/usr/bin/ffmpeg' 

# model params 
vmax = 5 
lenroad = 50 
prob = 0.4 

# sim params 
numiters = 10 

# traffic model 
def nasch(): 
    gaps = np.full(road.shape, -1) 
    road_r4 = np.full(road.shape, -1) 
    for n,x in enumerate(road): 
     if x > -1: 
      d = 1 
      while road[(n+d) % len(road)] < 0: 
       d += 1 
      d -= 1 
      gaps[n] = d 

    road_r1 = np.where(road!=-1, np.minimum(road+1, vmax), -1) 
    road_r2 = np.where(road_r1!=-1, np.minimum(road_r1, gaps), -1) 
    road_r3 = np.where(road_r2!=-1, np.where(np.random.rand() < prob, np.maximum(road-1, 0), road), -1) 
    for n,x in enumerate(road_r3): 
     if x > -1: 
      road_r4[(n+x) % len(road_r3)] = x 

    return road_r4 

def plot_nasch(*args): 
    road = nasch() 
    plot.set_array([road]) 
    return plot, 

# init road 
road = np.random.randint(-10, vmax+1, [lenroad]) 
road = np.where(road>-1, road, -1) 

# simulate 
fig = plt.figure() 
plot = plt.imshow([road], cmap='Pastel2', interpolation='nearest') 
for i in range(numiters): 
    ani = animation.FuncAnimation(fig, plot_nasch, frames=100, interval=500, blit=True) 
    plt.show() 

そして、私の代わりに、以前の1の下部に描かれた各道路の下の図、ただ1本の道路を取得:

enter image description here

+1

はい、それはmatplotlibのに間違いなく可能です。 'FuncAnimation'を使用して、シミュレーション結果を配列に並べ、' imshow'で表示し、アニメーションします。関係するステップごとに十分な例があります。 – ImportanceOfBeingErnest

+0

お持ちの場合具体的な問題を実装するには、明示的にこの問題について質問し、コードを[mcve]に減らし、出力が何であるかを明記し、予想されているものからどの程度ずれているかを明確に述べる必要があります。 –

+0

...問題は、私はプロットされた道路FuncAnimationを使用するたびに、単に各ステップで「下向き」つもりはない、同じポイントで、前の道路をオーバーライドすることで、私がやろうとしたものです実際には@ImportanceOfBeingErnest – ImportanceOfBeingErnest

答えて

0

私はなぜわからないが、これは、あなたが望む可能性があります時間はすでにプロット内の軸の1つであるため、時間をアニメートしたいと考えています。

ここでのアイデアは、アレイの行によって時間ステップ行のシミュレーション結果を格納し、この配列を再プロットすることです。これにより、以前のシミュレーション結果が失われることはない。

import numpy as np 

from matplotlib import pyplot as plt 
from matplotlib import animation, rc 

# model params 
vmax = 5 
lenroad = 50 
prob = 0.4 

# sim params 
numiters = 25 

# traffic model 
def nasch(): 
    global road 
    gaps = np.full(road.shape, -1) 
    road_r4 = np.full(road.shape, -1) 
    for n,x in enumerate(road): 
     if x > -1: 
      d = 1 
      while road[(n+d) % len(road)] < 0: 
       d += 1 
      d -= 1 
      gaps[n] = d 

    road_r1 = np.where(road!=-1, np.minimum(road+1, vmax), -1) 
    road_r2 = np.where(road_r1!=-1, np.minimum(road_r1, gaps), -1) 
    road_r3 = np.where(road_r2!=-1, np.where(np.random.rand() < prob, np.maximum(road-1, 0), road), -1) 
    for n,x in enumerate(road_r3): 
     if x > -1: 
      road_r4[(n+x) % len(road_r3)] = x 

    return road_r4 


def plot_nasch(i): 
    print i 
    global road 
    road = nasch() 
    #store result in array 
    road_over_time[i+1,:] = road 
    # plot complete array 
    plot.set_array(road_over_time) 


# init road 
road = np.random.randint(-10, vmax+1, [lenroad]) 
road = np.where(road>-1, road, -1) 
# initiate array 
road_over_time = np.zeros((numiters+1, lenroad))*np.nan 
road_over_time[0,:] = road 



fig = plt.figure() 
plot = plt.imshow(road_over_time, cmap='Pastel2', interpolation='nearest', vmin=-1.5, vmax=6.5) 
plt.colorbar() 

ani = animation.FuncAnimation(fig, plot_nasch, frames=numiters, init_func=lambda : 1, interval=400, blit=False, repeat=False) 
plt.show() 
関連する問題