2016-12-05 30 views
0

matplotlibを使って何かの経路をプロットするのに問題があります。 ここには、私がやっていることの基本的なバージョンがあります。matplotlibを使ってPythonで軌跡をプロットする

本質的には、パスの途中で値が特定のしきい値(この場合は6)を超えているのを確認してから、後でその値を使用します。

ここでは、3つのリストが設定されています。 end_vectorは他の2つのリストに基づいています。単一シミュレーション中の任意の時間2過去の値が破損した場合、私は私のend_vector

trajectories_vectにオブジェクトの最後の位置を追加します、私はのリストを維持することによって、すべての5回のシミュレーションのための私の軌道を追跡したいものですリスト。私はこれを以下で明確にします。そして、timestep_vectは単一のシミュレーションのためのパスを格納します。

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) 

さて、私はこのような何かを得る、私の軌跡を印刷する場合、この部分では(私は唯一の2つのシミュレーション、代わりの完全な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]] 

これは良いですが、何をI起こりたい

私の問題は、私のパス(y軸)を自分の時間(x軸)に対して適切にプロットする方法がわからないことです。

まず、データをnumpy配列に入れたいのですが、これは後でnumpyから簡単にできる統計やその他のものを計算するために使用する必要があるためです。

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

ここでは問題の要点です。 matplotlibに私の軌跡(y軸)を置いているとき、各 "リスト"(numpyの行)を1つのパスとして扱うわけではありません。 5回のシミュレーションで5つのパスを取得する代わりに、5回のシミュレーションで9つのパスを取得しています。私は間違った方法で9時間間隔を使用しているので間違って入力していると思う。

明らか

enter image description here

、これは前述の理由で間違っている:

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

ここで生成された画像です。代わりに、自分の軌跡に5つのリスト(行)に基づいて5つのパスが必要です。私は問題が何かを理解しているようだが、それを修正する方法を知らない。

ご協力いただきありがとうございます。

答えて

2

np_trajectories = np.array(trajectories_vect)と呼ぶと、あなたの軌跡のリストは2dのnumpyの配列に変換されます。その寸法に関する情報はnp_trajectories.shapeに格納されており、場合によっては(5, 9)です。したがって、np_trajectoriesplt.plot()に渡すと、プロットライブラリはy値が最初の次元に格納されているとみなし、2番目の次元はプロットする個々の線を記述しているものとみなします。

あなたの場合、np_trajectories配列を転置するだけです。あなたは時間とx軸をプロットしたい場合はnumpyでは、それは

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

のと同じくらい簡単です、代わりに1のステップでは、リストや配列としてあなたの時間進行を定義する必要があります。それをやったこと、 timesteps

+0

恐ろしい:numpyでは、次の図を生成

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

ような何かを行うことができます。どうもありがとうございます。 すぐにフォローアップしてください。自分のx軸が自分のタイムステップと一貫していることを確認するにはどうすればよいですか? delta_tを反映させたい。すなわち期間1-9を有する。そして今、それはやっていません。 – DudeWah

+0

@DudeWah私は、(私の考えである)あなたのケースの時系列としてx軸をプロットする答えを更新しました。 –

+0

すべてを明確にしてくれてありがとう! – DudeWah

関連する問題