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

gnuplot を使って,パラメータを変えて複数の曲線を一気にグラフにする例。オプションの設定法についてもまとめてみた。

例:斜方投射

簡単のために(初速度 $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$$

Jupyter Notebook でのグラフサイズの設定例

In [1]:
%gnuplot inline svg size 600, 400 font ",14"

関数の定義

In [2]:
# 角度は度で
set angles degrees

x(t, theta) = t*cos(theta)
y(t, theta) = t*sin(theta) - t**2/2
td(theta) = 2*sin(theta)

# 媒介変数表示のグラフ
set parametric
Out[2]:
	dummy variable is t for curves, u/v for surfaces

軌道のグラフ

とりあえず 1 本の軌道を描く

$\theta = 45^{\circ}$ での斜方投射の軌道をグラフにしてみる。

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

In [3]:
theta = 45
plot [t=0:td(theta)] x(t, theta), y(t, theta)

オプション設定例

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

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

gnuplot では,一旦 set コマンドでオプションを設定すると,unset や新たに set しない限り,設定内容がそのまま残ります。

In [4]:
theta = 45

# オプション設定
# グリッド
set grid
# 座標軸のラベル
set xlabel "x"
set ylabel "y"
# グラフのタイトル
set title "斜方投射"
# 表示範囲
set xrange [0:1.1]
set yrange [0:0.5]
# アスペクト比
set size ratio 0.5/1.1
# 座標軸の目盛
set xtics 0.1

plot [t=0:td(theta)] x(t, theta), y(t, theta) title sprintf("θ=%2d°", theta)

2 本の軌道を描く

$\theta = 30^{\circ}$ と $\theta = 45^{\circ}$ の2本のグラフを描く例。

In [5]:
# 媒介変数 t の範囲を共通に
# y < 0 まで plot するかもしれないが yrange [0:0.5] でカット
set trange [0:2]

plot x(t, 45), y(t, 45) title sprintf("θ=%2d°", 45), \
     x(t, 30), y(t, 30) title sprintf("θ=%2d°", 30)

2 本の軌道を描くもう一つの例

角度 th の配列をつくり,配列の各要素について plot for でグラフにしてみます。

In [6]:
array th[2] = [45, 30]
In [7]:
plot for [i=1:2] \
    x(t, th[i]), y(t,th[i]) title sprintf("θ=%2d°", th[i])

複数の軌道を一度に描く

$\theta$ の値を $30^{\circ}$ から $60^{\circ}$ まで $5^{\circ}$ 刻みで変えて,複数の曲線を一度に描く例。

In [8]:
N = 7
array th[N]
do for [i=1:N] {
    th[i] = 60 - 5*(i-1)
}

plot for [i=1:N] \
    x(t, th[i]), y(t,th[i]) title sprintf("θ=%2d°", th[i])