ねるねるねるねをねらずにくうぜ

C とかC++(予定)とかpythonとかgnuplotとかmatlabとかmathematicaとか書く予定ですが、最終的にはねるねるねるねをねらずに食うことを目標にしているブログです

【matplotlib】 軌跡を時間で色分けしてプロット

久々の投稿。

タイトル、どんなにしたらいいのかわからなかった

状況設定

ひとまず今回の状況設定。

空間を運動する粒子の軌跡を描くが、時間の情報も載せたい。

例えば、ボールを初速度 {v_{0}}で地面から{45^{\circ}}の角度で投げた時、軌跡は

{y=\frac{1}{\sqrt{2}}v_{0}t - \frac{1}{2}gt^{2}}

{x=\frac{1}{\sqrt{2}}v_{0}t}

このボールの軌跡を二次元プロットした時、下のようになるf:id:V0S-FRMK:20150913001850p:plain

これだと、時間の情報が無いので、○秒後にどこにいるか、とかはわかりにくい。 そこで、色に時間の情報を持たせることはできないか?というのが今回のお話。

ちなみにさっきのプロットのソースはこんなん

import numpy as np
import matplotlib.pylab as plt
t=np.linspace(0,1,1000)
v=4.9*np.sqrt(2.)
g=9.8
y=v*t/np.sqrt(2.) - .5*g*t*t
x=v*t/np.sqrt(2.)
plt.figure(figsize=(5,4))
plt.plot(x,y)
plt.xlabel(r'$x$',fontsize=22)
plt.ylabel(r'$y$',fontsize=22)

結論

from matplotlib import cm
plt.scatter(x,y,
            c=t,#色と時系列の対応
            cmap=cm.jet,#カラーマップの種類
            marker='.',lw=0)
#line width(lw)は0にしないと多分よく見えないと思う

ax=plt.colorbar()#カラーマップの凡例
ax.set_label('time [sec]')#カラーバーのラベルネーム

f:id:V0S-FRMK:20150913003046p:plain

こんな感じになる。

解説

カギは、

  • plt.scatterを使う
  • lw=0を設定
  • c=hogeで色と対応付ける配列を与える
  • cmapでカラーマップの種類

こんなところか?

あと、scatterなので点でしかプロットできないのが難点。誰か通常のline plotでもでける方法を教えて下さい。

ちなみに、c=tをc=yにすると、こんな感じ。y座標が色に対応する

f:id:V0S-FRMK:20150913003519p:plain

おまけ

放物線だと有り難みがわからんので、ブラウン運動でやってみよう

ここ から引用

f:id:V0S-FRMK:20150913005626p:plain

こんな感じ。ソースは省略。 色が時間に対応しているので、どこからどこに移動したかがわかる だが、どのスポットからどのスポットに移動したかはわからぬ・・・line plotで色を変えられれば最高なのに。