Pynote

Python、機械学習、画像処理について

matplotlib - quiver() によるベクトル図の作成

概要

matplotlib で quiver() を利用したベクトル図の作成方法について

基本的な使い方

次の4通りの呼び方ができる。

quiver(U, V, **kw)
quiver(U, V, C, **kw)
quiver(X, Y, U, V, **kw)
quiver(X, Y, U, V, C, **kw)
  • U, V: ベクトル
  • X, Y: ベクトルの基点
  • C: ベクトルの色

引数 U, V

引数 U, V でベクトルを指定する。
基点 X, Y が省略されてる場合、単位格子状の点が基点となる。

1次元配列の場合

U = np.random.random(7)
V = np.random.random(7)

fig, ax = plt.subplots(figsize=(6, 6))
ax.quiver(U, V)
plt.show()

2次元配列の場合

U = np.random.random((7, 7))
V = np.random.random((7, 7))

fig, ax = plt.subplots(figsize=(6, 6))
ax.quiver(U, V)
plt.show()


引数 X, Y

X, Y で基点を指定できる。

1次元配列の場合

X = np.arange(-3, 4)
Y = np.arange(3, -4, -1)
U = np.random.random(X.shape)
V = np.random.random(X.shape)

fig, ax = plt.subplots(figsize=(6, 6))
ax.quiver(X, Y, U, V)
plt.show()

2次元配列の場合

X, Y = np.mgrid[-3:4, -3:4]
U = np.random.random(X.shape)
V = np.random.random(X.shape)

fig, ax = plt.subplots(figsize=(6, 6))
ax.quiver(U, V)
plt.show()


引数 C

C でベクトルの色を指定できる。

X, Y = np.mgrid[-3:4, -3:4]
U = np.random.random(X.shape)
V = np.random.random(X.shape)
colors = np.random.random(X.shape + (3,))

fig, ax = plt.subplots(figsize=(6, 6))
ax.quiver(X, Y, U, V, colors)
plt.show()

全部同じ色にする場合は color 引数で指定する。

X, Y = np.mgrid[-3:4, -3:4]
U = np.random.random(X.shape)
V = np.random.random(X.shape)

fig, ax = plt.subplots(figsize=(6, 6))
ax.quiver(X, Y, U, V, color='blue')
plt.show()


quiver を使って関数の勾配を可視化する。

f(x, y) = x^2 + y^2 + xy という関数を考える。
\nabla f(x, y) = (2 x + y, 2 y + x)^T である。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

def f(x, y):
    return x**2 + y**2 + x * y

def gradient(x, y):
    df_x = 2 * x + y
    df_y = 2 * y + x

    return df_x, df_y

 [-10, 10]^2 の範囲に格子状の点を作成し、各点の関数値及び勾配ベクトルを計算する。

X, Y = np.mgrid[-10:11, -10:11]
Z = f(X, Y)  # 各点での関数 f の値を計算する。
U, V = gradient(X, Y)  # 各点での関数 f の勾配を計算する。

左側に勾配のベクトル図、右側に関数のグラフを作成する。

fig = plt.figure(figsize=(10, 5))

# 勾配のベクトル図を作成する。
ax1 = fig.add_subplot(121)
ax1.set_title('contour')
quiver = ax1.quiver(X, Y, U, V)
print(type(quiver))  # <class 'matplotlib.quiver.Quiver'>

# 3D グラフを作成する。
ax2 = fig.add_subplot(122, projection='3d')
ax2.set_title('surface')
ax2.plot_surface(X, Y, Z)

plt.show()