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()
../_images/7588a088bf7aee024891c14111574816314294948c6eeccfff8c4fec69fd8dc6.png

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次元配列に変換されます。

また、CU, 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()
../_images/f8b468e22a9022a8d36ae0d90da4e201dae30c7641cf2e7058f3f367404ddca8.png

カラーマップは以下のように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()
../_images/1ae4a597b4611fbe3c39d6886dc910cd0f8ff4a9240294f1728fd73aa96d451b.png

矢印の長さの正規化#

ベクトルの大きさを色で表現する場合、矢印の長さとして表現する必要はなくなります。 矢印の長さが不揃いだとグラフが見づらくなるため、矢印の長さを同じにした方が良い場合もあります。

以下に例を示します。 配列の計算が必要になるため、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()
../_images/cb9f6b89ce3229d8819e015c8849bc454bf6b93ca5a81b6d71a488e706aa6b8d.png

矢印の表示設定#

ax.quiverの以下のオプションで矢印の表示を変更できます。

  • pivot (str): 矢印の起点の位置が位置の座標 (X, Y) に対してどこになるか指定。"tail"(始端。デフォルト)、'mid', 'middle'(中央), 'tip'(先端)から選択

  • scale (float): 矢印の長さのスケール。値が大きいほど矢印が小さくなります

  • width (float): 矢印の軸部分の太さ

  • headwidth (float): 矢印の頭部分の太さ(デフォルト:3

  • headlength (float): 矢印の頭部分の長さ(デフォルト:5

  • headaxislength (float): 矢印の頭が軸と接する部分の長さ(デフォルト:4.5

参考サイト#