2017-02-09 1 views
0

Ich arbeite derzeit an Staus Analyse und fragte mich, ob es eine Möglichkeit gibt, die Generierung einer Handlung solcher Marmeladen zu animieren.Matplotlib animieren Raum gegen Zeit Plot

Eine Handlung dieser Dinge wächst von bis zum unteren Ende der Figur, jede 'Zeile' ist eine Zeitinstanz. Die horizontale Achse ist nur die Straße, die an jedem Punkt die Position jedes Fahrzeugs und mit einem bestimmten numerischen Wert die Geschwindigkeit anzeigt. Wenn Sie also verschiedene Farben auf verschiedene Geschwindigkeiten anwenden, erhalten Sie eine Zeichnung, die zeigt, wie sich ein Stau in einer bestimmten Straße durch die Zeit entwickelt.

Meine Frage ist, wie kann ich Matplotlib verwenden, um eine Animation jeder Instanz der Straße in der Zeit zu generieren, um eine solche Handlung zu erhalten?

Die Handlung ist so etwas wie dieses:

Ich bin eine Straße mit Fahrzeugen mit bestimmten Geschwindigkeiten durch die Zeit zu simulieren, so möchte ich eine Handlung animieren zeigt, wie die Staus entwickeln ...

EDIT:

ich einige Code hinzufügen, um deutlich zu machen, was ich bereits

tun
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() 

Und ich bekomme folgende Abbildung, nur eine Straße statt jeder Straße am unteren Ende der vorherigen gemalt:

enter image description here

+1

Ja, es ist definitiv möglich mit Matplotlib. Sie würden Ihre Simulationsergebnisse in ein numpliges Array setzen, mit 'imshow' anzeigen und mit' FuncAnimation' animieren. Es gibt genug Beispiele für jeden der beteiligten Schritte. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest in der Tat, das ist, was ich versucht habe, Problem ist, dass jedes Mal, wenn ich FuncAnimation benutze die geplottete Straße einfach überschreibt die vorherige Straße an der gleichen Stelle, nicht 'nach unten' bei jedem Schritt ... –

+0

Wenn Sie eine haben Wenn Sie ein bestimmtes Problem mit der Implementierung haben, müssen Sie explizit nach diesem Problem fragen, indem Sie Ihren Code auf [mcve] reduzieren, klar angeben, was die Ausgabe ist und wie weit sie von dem abweicht, was Sie erwarten. – ImportanceOfBeingErnest

Antwort

0

Dies ist möglicherweise, was Sie wollen, obwohl ich nicht sicher bin, warum Sie möchte die Zeit animieren, da die Zeit bereits eine der Achsen in der Handlung ist.

Die Idee hier ist, die Simulationsergebnisse eines Zeitschritts Zeile für Zeile in einem Array zu speichern und dieses Array neu zu plotten. Dadurch gehen vorherige Simulationsergebnisse nicht verloren.

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()