Python の Matplotlib を使って,パラメータを変えて複数の曲線を一気にグラフにする例。オプションの設定法についてもまとめてみた。
例:斜方投射
簡単のために(初速度 $v_0 \rightarrow 1$, 重力加速度 $g \rightarrow 1$ などとして)適宜無次元化した解は,以下のように時間 $t$ と投射角度 $\theta$ の関数となる。
\begin{eqnarray}
x(t, \theta) &=& t \cos\theta \\
y(t, \theta) &=& t \sin\theta -\frac{1}{2} t^2
\end{eqnarray}
$t=0$ で地上 $y=0$ から投射された物体がふたたび地上に落ちるまでの滞空時間 $t_d$ は
$$t_d(\theta) = 2 \sin\theta$$
必要なモジュールの import
必要なモジュールを import します。
import numpy as np
import matplotlib.pyplot as plt
# グラフを SVG で Notebook にインライン表示
%config InlineBackend.figure_formats = ['svg']
関数の定義
# 角度 th は度で
def x(t, th):
theta = np.radians(th)
return t*np.cos(theta)
def y(t, th):
theta = np.radians(th)
return t*np.sin(theta) - t**2/2
def td(th):
theta = np.radians(th)
return 2*np.sin(theta)
軌道のグラフ
とりあえず 1 本の軌道を描く
$\theta = 45^{\circ}$ での斜方投射の軌道をグラフにしてみる。
まずは,とりあえずのグラフ:
# θ = 45° のグラフ
th = 45
t = np.linspace(0, td(th), 100)
plt.plot(x(t, th), y(t, th));
オプション設定例
以下のようなオプションを設定して,もう少し体裁を整えます。
- $\theta$ の値を凡例に
- グリッドを点線で
- 座標軸のラベルとグラフのタイトル
- 横軸縦軸の表示範囲
- 縦軸横軸のアスペクト比
- 座標軸の目盛の間隔
ここでは,plt.___
でオプションを設定しています。
# θ = 45° のグラフ
th = 45
t = np.linspace(0, td(th), 100)
plt.plot(x(t, th), y(t, th), label = 'θ = %2d°' % th)
# オプション設定
plt.grid(linestyle='dotted')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('斜方投射')
plt.xlim(0, 1.1)
plt.ylim(0, 0.5)
plt.gca().set_aspect('equal')
# x の目盛を 0.1 刻みに
plt.xticks([0.1*i for i in range(11)])
# y の目盛を 0.1 刻みに
plt.yticks([0.1*i for i in range(6)])
plt.legend();
2 本の軌道を描く
$\theta = 30^{\circ}$ と $\theta = 45^{\circ}$ の2本のグラフを描く例。
# θ = 45° のグラフ
th = 45
t = np.linspace(0, td(th), 100)
plt.plot(x(t, th), y(t, th), label = 'θ = %2d°' % th)
# θ = 30° のグラフ
th = 30
t = np.linspace(0, td(th), 100)
plt.plot(x(t, th), y(t, th), label = 'θ = %2d°' % th)
# オプション設定
plt.grid(linestyle='dotted')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('斜方投射')
plt.xlim(0, 1.1)
plt.ylim(0, 0.5)
plt.gca().set_aspect('equal')
# x の目盛を 0.1 刻みに
plt.xticks([0.1*i for i in range(11)])
# y の目盛を 0.1 刻みに
plt.yticks([0.1*i for i in range(6)])
plt.legend();
オプション設定の別の例
ここでは,ax.___
でオプション設定を行ってみます。
fig, ax = plt.subplots()
# θ = 45° のグラフ
th = 45
t = np.linspace(0, td(th), 100)
plt.plot(x(t, th), y(t, th), label = 'θ = %2d°' % th)
# θ = 30° のグラフ
th = 30
t = np.linspace(0, td(th), 100)
plt.plot(x(t, th), y(t, th), label = 'θ = %2d°' % th)
# オプション設定
ax.set_aspect('equal')
ax.set_xlim(0, 1.1)
ax.set_ylim(0, 0.5)
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_title("斜方投射")
# グリッドを dotted で
ax.grid(linestyle = 'dotted')
# x の目盛を 0.1 刻みに
ax.set_xticks([0.1*i for i in range(11)])
# y の目盛を 0.1 刻みに
ax.set_yticks([0.1*i for i in range(6)])
ax.legend();
複数の軌道を一度に描く
$\theta$ の値を $30^{\circ}$ から $60^{\circ}$ まで $5^{\circ}$ 刻みで変えて,複数の曲線を一度に描く例。
fig, ax = plt.subplots()
# for で繰り返し処理
for th in range(60, 29, -5):
t = np.linspace(0, td(th), 100)
plt.plot(x(t, th), y(t, th), label = 'θ = %2d°' % th)
# オプション設定
ax.set_aspect('equal')
ax.set_xlim(0, 1.1)
ax.set_ylim(0, 0.5)
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_title("斜方投射")
# グリッドを dotted で
ax.grid(linestyle = 'dotted')
# x の目盛を 0.1 刻みに
ax.set_xticks([0.1*i for i in range(11)])
# y の目盛を 0.1 刻みに
ax.set_yticks([0.1*i for i in range(6)])
ax.legend();