Matplotlib ベクトル場のグラフ#
※記事内に商品プロモーションを含むことがあります。
公開日
Matplotlibでベクトル場のグラフをプロットするにはax.quiver
を使用します。
ちなみにquiverは「矢筒」や「振動」の意味です。
ベクトル場グラフの例#
ax.quiver
を用いたベクトル場の例を以下に示します。
座標(x, y)=(1, 0)のベクトルは(1, 2), 座標(x, y)=(2, 0)のベクトルは(2, 2), ...としています。
import matplotlib.pyplot as plt
x = [[1, 2], [1, 2]]
y = [[0, 0], [1, 1]]
u = [[1, 2], [-2, -2]]
v = [[2, 2], [3, -3]]
fig, ax = plt.subplots()
ax.quiver(x, y, u, v)
ax.set_xlim(0.5, 2.5)
ax.set_ylim(-0.5, 1.5)
plt.show()

ax.quiver
の主な引数を説明します。
ax.quiver([X, Y], U, V, [C])
X
: ベクトルのx座標Y
: ベクトルのy座標U
: ベクトルのx方向の長さV
: ベクトルのy方向の長さC
: 矢印の色(値で指定)
[ ]
で囲んだ変数は省略可能です。
X
, Y
, U
, V
は1次元または2次元の配列となります。
原則として、4つの変数配列は同じ次元・要素数とする必要があります。
ただし、U
, V
が2次元配列かつX
, Y
が1次元配列の場合、X, Y = np.meshgrid(X, Y)
として自動的に2次元配列に変換されます。
また、C
もU
, V
と同じ配列サイズとする必要があります。
矢印の色#
矢印の色を指定する方法を解説します。
ax.quiver
の5番目の引数に、各矢印の色を配列で指定します。
この配列(以下の例ではc
)は、矢印の長さの配列U
, V
と同じ配列サイズとなります。
なお、例ではplt.colorbar
を使ってカラーバーも表示しています。
c = [[0, 1], [2, 3]]
fig, ax = plt.subplots()
mappable = ax.quiver(x, y, u, v, c)
plt.colorbar(mappable, ax=ax)
ax.set_xlim(0.5, 2.5)
ax.set_ylim(-0.5, 1.5)
plt.show()

カラーマップは以下のようにcmap
引数で指定できます。
カラーマップについてはMatplotlibのカラーマップの記事を参照してください。
fig, ax = plt.subplots()
mappable = ax.quiver(x, y, u, v, c, cmap="cool")
plt.colorbar(mappable, ax=ax)
ax.set_xlim(0.5, 2.5)
ax.set_ylim(-0.5, 1.5)
plt.show()

矢印の長さの正規化#
ベクトルの大きさを色で表現する場合、矢印の長さとして表現する必要はなくなります。 矢印の長さが不揃いだとグラフが見づらくなるため、矢印の長さを同じにした方が良い場合もあります。
以下に例を示します。
配列の計算が必要になるため、NumPyを使用します。
vector_length
は各ベクトルの長さです。
これでU
, V
(u_np
, v_np
) を割って正規化し、全てのベクトルの長さを1にします。
なお、デフォルトでは矢印の長さが少し短かったため、scale=10
オプションで長くしています(値を小さくするほど矢印が長くなります)。
import numpy as np
u_np = np.array(u)
v_np = np.array(v)
vector_length = np.sqrt(u_np**2 + v_np**2)
norm_u = u_np / vector_length
norm_v = v_np / vector_length
fig, ax = plt.subplots()
mappable = ax.quiver(x, y, norm_u, norm_v, vector_length, scale=10)
plt.colorbar(mappable, ax=ax)
ax.set_xlim(0.5, 2.5)
ax.set_ylim(-0.5, 1.5)
plt.show()

矢印の表示設定#
ax.quiver
の以下のオプションで矢印の表示を変更できます。
pivot
(str): 矢印の起点の位置が位置の座標 (X
,Y
) に対してどこになるか指定。"tail"
(始端。デフォルト)、'mid'
,'middle'
(中央),'tip'
(先端)から選択scale
(float): 矢印の長さのスケール。値が大きいほど矢印が小さくなりますwidth
(float): 矢印の軸部分の太さheadwidth
(float): 矢印の頭部分の太さ(デフォルト:3
)headlength
(float): 矢印の頭部分の長さ(デフォルト:5
)headaxislength
(float): 矢印の頭が軸と接する部分の長さ(デフォルト:4.5
)