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
tunimport 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:
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
@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 ... –
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