Matplotlibの使い方③(plt.streamplot、plt.fill、plt.polar)|Pythonによる可視化入門 #3

f:id:lib-arts:20190611223958p:plain

#1では連載の経緯と、よく使う可視化機能であるmatplotlib.pyplotより、plt.plot、plt.scatter、plt.histについてまとめました。

また、#2では"Sample plots in Matplotlib"より、plt.bar、plt.pie、plt.hist2dをご紹介しました。

#3では少々発展的なグラフの描画として、plt.streamplot、plt.fill、plt.polarについて取り扱います。
以下目次になります。
1. 発展的なグラフの描画機能(plt.streamplot、plt.fill、plt.polar)
1-1. plt.streamplotを用いたベクトル場の描画
1-2. plt.fillを用いた曲線や多角形の色付けの描画
1-3. plt.polarを用いた極座標の描画
2. まとめ

 

1. 発展的なグラフの描画機能(plt.streamplot、plt.fill、plt.polar)
#3では少々発展的なグラフの描画ということで、plt.streamplot、plt.fill、plt.polarの三つについて取り扱っていきます。


1-1. plt.streamplotを用いたベクトル場の描画
1-1ではplt.streamplotを用いたベクトル場の描画を行います。

matplotlib.pyplot.streamplot — Matplotlib 3.1.0 documentation

Streamplot — Matplotlib 3.1.0 documentation
上記にドキュメントとサンプルコードがあるので参考にします。

詳細の確認から入るとわかりづらいので、サンプルコードを簡易化したコードをまず動かしてみます。

import numpy as np
import matplotlib.pyplot as plt

w = 3
Y, X = np.mgrid[-w:w:100j, -w:w:100j]
U = -1 - X**2 + Y
V = 1 + X - Y**2

# Varying density along a streamline
plt.streamplot(X, Y, U, V, density=[0.5, 1])

plt.show()

上記を動かした結果が下記になります。

f:id:lib-arts:20190614163257p:plain
plt.streamplotに引数を与えて実行することで、ベクトル場(vector field)の描画を行っています。与えている引数を先に確認する方が良さそうなので、下記のようにshapeメソッドを用いて行列のサイズを確認します。

f:id:lib-arts:20190614163339p:plain
上記より、100×100となっていることがわかります。また、Xの2行目と2列目を出力すると下記のようになります。

f:id:lib-arts:20190614163358p:plain
np.mgridを用いることでX方向には値が変化し、Y方向には値が変化しないような行列になっていることがわかります。ちなみにYはこの反対になっています。また、UとVについてはそれぞれの座標でのX値とY値から速度を計算しています。

f:id:lib-arts:20190614163559p:plain
上記のplt.streamplotのドキュメントによると、Uはx方向の速度、Vはy方向の速度となっています。

一例だけだとわかりづらいので、ベクトルの色の変化も加えたもう一例もご紹介します。

import numpy as np
import matplotlib.pyplot as plt

w = 3
Y, X = np.mgrid[-w:w:100j, -w:w:100j]
U = -1 - X**2 + Y
V = 1 + X - Y**2
speed = np.sqrt(U**2 + V**2)

# Varying color along a streamline
strm = plt.streamplot(X, Y, U, V, color=speed, linewidth=2, cmap='autumn')
plt.colorbar(strm.lines)

plt.show()

上記の実行結果は下記になります。

f:id:lib-arts:20190614164408p:plain
ベクトルの速度の絶対値が大きい点での色が黄色、小さい点が赤で表示されるように色付けが行われています。
このように、plt.streamplotを用いることでベクトル場を図示することができます。


1-2. plt.fillを用いた曲線や多角形の色付けの描画
1-2ではplt.fillを用いた曲線や多角形の色付けの描画を見ていきます。

Filled polygon — Matplotlib 3.1.0 documentation

上記のサンプルコードをまずは参考に見ていきます。koch_snowflakeを読み込んだのちに、コードを実行することで下記のような結果を得ることができます。

f:id:lib-arts:20190614165206p:plain
また、下記では色付けの変更も行っています。

f:id:lib-arts:20190614165225p:plain
plt.fillの入力の情報をまだ確認していないので、次に内容の確認を行っていきます。まずはxとyの行列のサイズを確認します。

f:id:lib-arts:20190614170207p:plain
上記を見たところ、fillの引数として与えているxとyはそれぞれx座標とy座標ということがわかります。確認のためにplt.plotやplt.scatterを用いて図示すると下記のようになります。

f:id:lib-arts:20190614170224p:plain

上記によってplt.fillの入力としては、xとyの座標を与えているということがわかりました。簡単な例で下記も試してみましょう。

x = np.array([1,-1,-1,1])
y = np.array([1,1,-1,-1])
plt.fill(x, y)
plt.show()

上記を実行すると下記のようになります。正方形の描画を行っています。

f:id:lib-arts:20190614170547p:plain
最後にドキュメントの内容も確認しておきます。

f:id:lib-arts:20190614170603p:plain

matplotlib.pyplot.fill — Matplotlib 3.1.0 documentation
上記では"Each polygon is defined by the lists of x and y positions of its nodes"とあり、多角形はノードのx座標、y座標のリストで定義されるとされており、xとyのノードの座標を与えるという認識で正しかったことがわかります。
このように、plt.fillを用いることで多角形の色付けを行うことができます。

 

1-3. plt.polarを用いた極座標の描画
1-3ではplt.polarを用いた極座標の描画を見ていきます。

f:id:lib-arts:20190614172009p:plain

matplotlib.pyplot.polar — Matplotlib 3.1.0 documentation
上記の仕様を見ると単に第一引数に角度(ラジアン)の情報、第二引数に長さの情報を与えるだけでさほど難しくなさそうなので、下記のコードを元に早速プロッティングを行っていきます。

import matplotlib.pyplot as plt

plt.polar(0,0,"yo")
plt.polar(0,1,"ro")
plt.polar(1,1,"bo")
plt.polar(2,1,"go")
plt.polar(0,2,"ro")
plt.polar(1,2,"bo")
plt.polar(2,2,"go")
plt.plot()

上記の実行結果としては下記のようになります。

f:id:lib-arts:20190614172027p:plain
角度がラジアン表記なので、円周率(3.14...)で180度を示すような座標系になっています。
このようにplt.polarを用いることで極座標表記を行うことができます。


2. まとめ
#3では発展的な描画の例として、plt.streamplot、plt.fill、plt.polarらについて取り扱いました。
#4ではタイトル付けや複数画像の表示など、描画にあたって知っておきたい内容についてまとめていきます。