2016-12-05 6 views
0

Ich habe einige Probleme mit Matplotlib, um den Pfad von etwas zu plotten. Hier ist eine grundlegende Version der Art von Dingen, die ich mache.Plottrajektorien in Python mit Matplotlib

Im Wesentlichen sehe ich, wenn der Wert einen bestimmten Schwellenwert (6 in diesem Fall) an einem beliebigen Punkt während des Pfads bricht und dann später etwas damit tun.

Jetzt habe ich 3 Listen eingerichtet. Der end_vector basiert auf den anderen beiden Listen. Wenn der Wert während einer einzelnen Simulation zweimal überschritten wird, werde ich die letzte Position des Objekts zu meinem 5 0 Simulationen hinzufügen, indem ich eine Liste von. Halte Listen. Ich werde das unten klären. Und timestep_vect speichert den Pfad für eine einzelne Simulation.

from random import gauss 
from matplotlib import pyplot as plt 
import numpy as np 

starting_val = 5 
T = 1     #1 year 
delta_t = .1   #time-step 
N = int(T/delta_t)  #how many points on the path looked at 
trials = 5    #number of simulations 

#main iterative loop 
end_vect = [] 
trajectories_vect = [] 
for k in xrange(trials): 
    s_j = starting_val 
    timestep_vect = [] 
    for j in xrange(N-1): 
     xi = gauss(0,1.0) 
     s_j *= xi 
     timestep_vect.append(s_j) 
    trajectories_vect.append(timestep_vect) 
    if max(timestep_vect) > 5: 
     end_vect.append(timestep_vect[-1]) 
    else: 
     end_vect.append(0) 

Okay, an dieser Stelle, wenn ich meine Bahnen zu drucken, ich so etwas wie dieses (ich gepostet nur zwei Simulationen, statt die volle 5):

[[ -3.61689976e+00 2.85839230e+00 -1.59673115e+00 6.22743522e-01 
1.95127718e-02 -1.72827152e-02 1.79295788e-02 4.26807446e-02 
-4.06175288e-02] [ 4.29119818e-01 4.50321728e-01 -7.62901016e-01 
-8.31124346e-02 -6.40330554e-03 1.28172906e-02 -1.91664737e-02 
-8.29173982e-03 4.03917926e-03]] 

Dieses gut ist und was ich möchte passieren.

Jetzt ist mein Problem, dass ich nicht weiß, wie ich meinen Weg (Y-Achse) richtig gegen meine Zeit (X-Achse) zeichne.

Zuerst möchte ich meine Daten in numply Arrays setzen, weil ich sie später verwenden muss, um einige Statistiken und andere Dinge zu berechnen, die aus Erfahrung numpy sehr einfach macht.

#creating numpy arrays from list 
#might need to use this with matplotlib somehow 
np_trajectories = np.array(trajectories_vect) 
time_array = np.arange(1,10) 

Hier ist der Kern des Problems. Wenn ich meine Trajektorien (y-Achse) in matplotlib einfüge, behandelt es nicht jede "Liste" (Zeile in numpy) als einen Pfad. Anstatt 5 Pfade für 5 Simulationen zu bekommen, bekomme ich 9 Pfade für 5 Simulationen. Ich glaube, dass ich Sachen falsch eingib, deshalb benutzt es die 9 Zeitintervalle in der falschen Weise.

#matplotlib stuff 
plt.plot(np_trajectories) 
plt.xlabel('timestep') 
plt.ylabel('trajectories') 
plt.show() 

Hier ist das Bild erzeugt:

enter image description here

Offensichtlich ist dies falsch zu dem zuvor benannten Grund. Stattdessen möchte ich 5 Pfade basierend auf den 5 Listen (Zeilen) in meinen Trajektorien haben. Ich verstehe das Problem, weiß aber nicht, wie ich es beheben soll.

Vielen Dank im Voraus für die Hilfe.

Antwort

2

Wenn Sie np_trajectories = np.array(trajectories_vect) aufrufen, wird Ihre Liste der Trajektorien in ein 2d numpy Array umgewandelt. Die Informationen über seine Abmessungen sind in np_trajectories.shape gespeichert und in Ihrem Fall ist dies (5, 9). Wenn Sie also np_trajectories an plt.plot() übergeben, nimmt die Zeichenbibliothek an, dass die y-Werte in der ersten Dimension gespeichert sind, während die zweite Dimension einzelne zu plottende Linien beschreibt.

In Ihrem Fall, alles, was Sie tun müssen, ist Ihre np_trajectories Array zu transponieren.In numpy ist es so einfach wie

plt.plot(np_trajectories.T) 
plt.xlabel('timestep') 
plt.ylabel('trajectories') 
plt.show() 

Wenn Sie die x-Achse als Zeit dargestellt werden soll, anstelle der Schritte von einem, müssen Sie Ihren zeitlichen Verlauf als Liste oder ein Array definieren. In numpy, können Sie so etwas wie

times = np.linspace(0, T, N-1) 
plt.plot(times, np_trajectories.T) 
plt.xlabel('timestep') 
plt.ylabel('trajectories') 
plt.show() 

tun, die die folgende Abbildung erzeugt: timesteps

+0

Awesome, dass es tat. Ich danke dir sehr. Nur eine schnelle Folge. Wie stelle ich sicher, dass meine X-Achse mit meinen Zeitschritten übereinstimmt? Ich möchte, dass es delta_t widerspiegelt. h., haben die Zeiträume 1-9. Und momentan tut es das nicht. – DudeWah

+0

@DudeWah Ich habe die Antwort aktualisiert, um die Darstellung der X-Achse als eine Zeitsequenz für (was ich denke) in Ihrem Fall einzuschließen. –

+0

Vielen Dank für die Aufklärung! – DudeWah