matplotlib を利用したベクトル図の描画

Posted on 2019/11/28 in programming , Updated on: 2019/11/28

ベクトル図

matplotlib には、ベクトル図を描画する quiver() が実装されている。公式では、numpy.meshgridを使用した方法が紹介されているが、ここでは計測実験評価等で利用することを想定した描画方法を紹介する。具体的には、csv ファイルから座標データおよびずれデータを読み込み、各ポイントにおける理想座標からのズレ量をベクトルとして描画する。

今回は、test.csv を用意して使用する。
このデータは、カラムAがサンプル数(441個)、カラムB,C は理想座標のX,Y、カラムD,E は各ポイントのずれ量 dX,dY を含んでいる。下記でそれぞれ描画したグラフを示している。

テストデータ

In [4]:
import pandas as pd
import numpy as np
df = pd.read_csv('test.csv', index_col='No')
df.head()
Out[4]:
X Y dX dY
No
1 -10 -10 -1.0 -1.0
2 -9 -10 -0.9 -1.0
3 -8 -10 -0.8 -1.0
4 -7 -10 -0.7 -1.0
5 -6 -10 -0.6 -1.0

まず理想座標 X, Y を描画する。X, Y ともに -10.0 ~ 10.0 まで 1 ステップの座標であることがわかる。

In [5]:
# グラフ描画用ライブラリのインポート
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
%matplotlib inline

# 散布図として描画
fig, ax = plt.subplots(figsize=(10, 10))
q = plt.scatter(x=df['X'], y=df['Y'], s=10, color='red')

# x, y ラベル
ax.set_xlabel('$X$', fontsize=15)
ax.set_ylabel('$Y$', rotation=0, fontsize=15)

ax.set_xticks(ticks=np.arange(-10,11,1))
ax.set_yticks(ticks=np.arange(-10,11,1))
plt.show()

ベクトル図の描画

次に理想座標からのずれ量(dx, dy)を用いてそのずれ量をベクトルとして描画する。描画には quiver を利用する。引数で各種設定ができるが、必須な引数として、各ベクトルの始点 X, Y およびそこからのベクトルの終点とのずれ量 U, V がある。
まずは、デフォルト設定のまま描画してみる。
※ U,V を X,Y と同じスケール似合わせるために、追加で引数を渡す。angles='xy', scale_units='xy', scale=1

In [10]:
X = df['X']
Y = df['Y']
U = df['dX']
V = df['dY']

fig, ax = plt.subplots(figsize=(10, 10))

# ベクトル図を描画
q = plt.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1)

ax.set_xlabel('$X$', fontsize=15)
ax.set_ylabel('$Y$', rotation=0, fontsize=15)
ax.set_xticks(ticks=np.arange(-10,11,1))
ax.set_yticks(ticks=np.arange(-10,11,1))
fig.show()

グラフの調整

グラフの見栄えを調整する主要なパラメータを示す。

引数 内容
width 各ベクトルの矢印部分のサイズ(長さ)を設定。
プロット幅に対する倍率を設定する。デフォルトは、0.005
headwidth 矢印の三角部のサイズ。デフォルトは、3
headaxislength 矢印の外線の長さ。これを長くすると
よりシャープなベクトルに。デフォルトは、5
color ベクトルの色設定
In [8]:
fig, ax = plt.subplots(figsize=(10, 10))

# ベクトル図を描画
q = plt.quiver(X, Y, U, V, width=0.003, headwidth=6,
               headlength=9, color='red',
               angles='xy', scale_units='xy', scale=1)

ax.set_xlabel('$X$', fontsize=15)
ax.set_ylabel('$Y$', rotation=0, fontsize=15)
ax.set_xticks(ticks=np.arange(-10,11,1))
ax.set_yticks(ticks=np.arange(-10,11,1))
plt.show()

凡例の設定 (quiverkey)

quiverkey を使って凡例を表示でき、ある大きさのベクトルも例示できる。引数としては、ベクトル図のインスタンス、凡例を置く場所(X,Y)、例示するベクトルの長さ(U)。

In [30]:
fig, ax = plt.subplots(figsize=(10, 10))

# ベクトル図を描画
q = plt.quiver(X, Y, U, V, width=0.003, headwidth=6,
               headlength=9, color='red',
               angles='xy', scale_units='xy', scale=1,
              )

# 凡例
ax.quiverkey(q, X=0.75, Y=1.009, U=25, label='Quiver key, length=1', labelpos='E',
             fontproperties={'size': 13})

ax.set_xlabel('$X$', fontsize=15)
ax.set_ylabel('$Y$', rotation=0, fontsize=15)
ax.set_xticks(ticks=np.arange(-10,11,1))
ax.set_yticks(ticks=np.arange(-10,11,1))
plt.show()