Matplotlib で複数の曲線を一気にグラフにする例とオプション設定例

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 します。

In [1]:
import numpy as np
import matplotlib.pyplot as plt

# グラフを SVG で Notebook にインライン表示
%config InlineBackend.figure_formats = ['svg']

関数の定義

In [2]:
# 角度 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}$ での斜方投射の軌道をグラフにしてみる。

まずは,とりあえずのグラフ:

In [3]:
# θ = 45° のグラフ
th = 45
t = np.linspace(0, td(th), 100)

plt.plot(x(t, th), y(t, th));

オプション設定例

以下のようなオプションを設定して,もう少し体裁を整えます。

  • $\theta$ の値を凡例に
  • グリッドを点線で
  • 座標軸のラベルとグラフのタイトル
  • 横軸縦軸の表示範囲
  • 縦軸横軸のアスペクト比
  • 座標軸の目盛の間隔

ここでは,plt.___ でオプションを設定しています。

In [4]:
# θ = 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本のグラフを描く例。

In [5]:
# θ = 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.___ でオプション設定を行ってみます。

In [6]:
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}$ 刻みで変えて,複数の曲線を一度に描く例。

In [7]:
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();