本記事では、Matplotlibを使ってベクトル場を書くコードを紹介していきます。
xy座標中にベクトルがあるような下の画像を出力します。
電磁場とか流体とかの実験データやシミュレーションデータを可視化するのに役に立つコードになると思います。
コード紹介
早速コード紹介。
ベクトル場を書くにはquiverとういう、Matplotlibでベクトル場を描画するための関数を使います。
この関数は、2次元平面上の点において、各点でのベクトルを矢印として表示するのに使用されます。
例えばMatplotlibの公式から引用したコードを少し変えたものを紹介します。、
import matplotlib.pyplot as plt
import numpy as np
# make data
x = np.linspace(0, 3, 3)
y = np.linspace(3, 0, 3)
X, Y = np.meshgrid(x, y)
U = X + Y
V = Y - X
# plot
fig, ax = plt.subplots()
ax.quiver(X, Y, U, V, color="C0", angles='xy',
scale_units='xy', scale=5, width=.015)
ax.set(xlim=(-1, 5), ylim=(-1, 5))
plt.show()
plt.close()
いくつか重要な点があるので解説していきます。
ax.quiverについて
この関数を使えば、ベクトル場を簡単に描画できます。
関数を使いこなすために必要なことは、引数を理解することです。
quiver関数の引数のなかでも重要なのが以下になります。
- X, Y : ベクトルが表示される点の座標を示す2次元の配列
- U, V: ベクトルの大きさ、UがX方向、VがY方向
- angles=’xy’:ベクトルの角度が x軸とy軸に対してどのように解釈されるかを制御
- scale_units=’xy’:ベクトルの大きさをどのようにスケーリングするかを指定するパラメータ
特にX,Yは重要。
X, Yについて
このベクトルの画像を出力するにはPythonの2次元配列の理解が必要です。
XとYの値を出力するとこんな感じです。
XとYには行列のように座標の数字が入っています。
今回は均等に1.5ずつ増減する値が入っていますが、[0, 2, 3]のようにバラバラでも大丈夫です。
先ほどの画像とXとYの各要素の数字を重ね合わせて表示すると
以下のようにX,Yの2次元配列の各要素はベクトルの矢印の根本の部分の座標になっています。
なのでベクトル場を描画する際には座標のデータが必要になるため、
もし自分でデータを用意してベクトル場を描画したい時にも、同様な2次元配列を準備する必要があります。
注意点としては、XとYは同じ大きさ(shape)のものにしてください。
今回だとXとYどちらも(3, 3)の大きさです。
UとVについて
UとVはそれぞれXとY方向のベクトルの大きさを示してます。
UとVに関してもXとYと同様に2次元配列で準備する必要があります。
今回のコードで使うUとVの値は以下の通り。
このUとVの値を見たら分かる人も多いと思いますが
こちらもXとYの座標に対応する数字の並びになっております。
先ほどと同じようにベクトルの画像と、U,Vの各要素を重ねて表示すると
以下のようになり、各要素がxとy座標に対応していることが分かります。
こちらも自分でデータを準備するときには、
2次元配列でxとy座標に対応するように並び替えて、ax.quiverにいれるといい感じになります。
おわりに
ここまで読んでいただきありがとうございました。
私は大学時代に流体のシミュレーションをしていたので
こうしたベクトルの画像の作成が必要だったので、この描画方法をよく使っておりました。
ヒートマップや等高線図とも組み合わせると
よりデータの表現の幅も広がるので、面白いと思います。
それではそれでは。