Matplotlibの極座標系の図#

公開日

極座標系の図をプロットするには、plt.subplots()subplot_kwオプションに{'projection': 'polar'}という辞書形式で与えます。

このとき、ax.plot()の最初の引数に角度[rad], 2番目の引数に原点からの距離を与えます。

import numpy as np
import matplotlib.pyplot as plt

theta = np.pi*np.arange(0, 3, 0.01)
r = np.arange(0, 3, 0.01)

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
plt.show()
../_images/363b833e7e454654c00cf5fc7daff42979900c5331f01deac1e14d7145948d2a.png

軸の範囲#

角度方向の軸の範囲はax.set_thetalim(), 動径方向の軸の範囲はax.set_rlim()でそれぞれ設定します。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_thetalim(0, np.pi)
ax.set_rlim(-3, 3)
plt.show()
../_images/c0898499b79112ab7ba78086ff9e0954ae04610aae7364273256c4cb66782b0a.png

軸の目盛り#

偏角方向#

偏角方向の軸の目盛りを設定するには、ax.set_thetagrids()を使用します。表示したい目盛りの角度[deg]を配列で与えます。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_thetagrids([0, 90, 180, 270])
plt.show()
../_images/72c98e827a3b1cad69c4cfb32ee475e539ff938a74ce7e5e4619ac6c83759a6f.png

labelsオプションで任意の目盛りラベルを設定できます。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_thetagrids([0, 90, 180, 270], labels=["E", "N", "W", "S"])
plt.show()
../_images/ceac3de9d0b014efbfc5ce62562cb99418dc1dd5c04c4e0b704be4783c0adebe.png

動径方向#

動径方向の軸の目盛りを設定するには、ax.set_rgrids()を使用します。表示したい目盛りの位置を配列で与えます。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_rgrids([0, 1, 2, 3])
plt.show()
../_images/ac8cc46692f55bbf5ab8efaf199e233657b0c98584206a924a91c9c3f6afa0b6.png

さらに、labelsオプションで任意の目盛りラベルを、angleで目盛りを表示する角度[deg]をそれぞれ設定できます。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_rgrids([0, 1, 2, 3], labels=["a", "b", "c", "d"], angle=60)
plt.show()
../_images/517f692fc37497227658056420c87f71a1e96bc33efb5fed13452560b78f4f99.png

偏角方向の軸の始点#

ax.set_theta_zero_location()によって、角度方向の軸の始点を指定できます。引数は方角であり、"N", "NW", "W", "SW", "S", "SE", "E", "NE"のいずれかを与えます。さらにoffsetオプションで半時計回りの回転角度[deg]を指定します(角度方向の軸の向きによらず、常に半時計回りの回転角度になります)。

以下は"N"で真上を始点とした例です。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_theta_zero_location("N")
plt.show()
../_images/f1ad37f9041b98bc8bf171569364b18354768fcf113375484725636e51202ccd.png

始点を真上からさらに半時計回りに10度回転させた例を以下に示します。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_theta_zero_location("N", offset=10)
plt.show()
../_images/41b08cec169a1918c139ba6362adb6a34c0baad6a29ad8affae39a622149056e.png

動径方向の軸の始点#

ax.set_rorigin()に負の値を指定することで、動径方向の原点を外側にずらせます。つまり、ドーナツグラフのような見た目になります。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_rorigin(-1)
plt.show()
../_images/8031c6f315cf4d4daf5e53b77beca4d828a4e90d7404cceefa445e683b0b6dbc.png

偏角の回転方向#

偏角の回転方向を反対(時計回り)にするには、ax.set_theta_direction(-1)を与えます。引数を1にすると、通常通り半時計回りとなります。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_theta_direction(-1)
plt.show()
../_images/d0c1c19b8e281a4d5d811f2892130b3e9bdf94af6fd2a49c52365b2be5f64885.png

極座標系の様々なプロット#

棒グラフ#

極座標系の棒グラフをプロットするには、ax.bar()を用います。widthオプションで棒の幅、alphaオプションで棒の色の透明度を指定できます。

theta2 = np.pi*np.arange(0, 2, 0.5)
r2 = np.arange(1, 3, 0.5)

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.bar(theta2, r2, width=0.3, alpha=0.7)
ax.bar(theta2+0.2, r2+0.5, width=0.3, alpha=0.7)
plt.show()
../_images/0202a0649747a58f8b81db682eb31e7170f31a6b816645bc1a651a70475c0082.png

散布図#

極座標系の散布図をプロットするには、ax.scatter()を用います。マーカーの大きさはsオプションで指定できます。その他のオプションについては散布図を参照して下さい。

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.scatter(theta2, r2)
ax.scatter(theta2+0.2, r2+0.5, s=100)
plt.show()
../_images/aa20cde24873b55ebc9673b54833efb6bd8326878320b82d3bfc92418701f173.png

ヒートマップ#

極座標系のヒートマップをプロットするには、ax.pcolor()を用います。最初の引数は角度[rad], 2番目の引数は動径、3番目の引数は色に対応するデータ(動径データ数×角度データ数の2次元配列)とします。

theta3 = np.linspace(0, 2*np.pi, 30) # データ数30の1次元配列(角度)
r3 = np.linspace(0, 100, 10) # データ数10の1次元配列(動径)

C = np.random.random_sample((10, 30)) # 10x30の2次元配列

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
mappable = ax.pcolor(theta3, r3, C, shading="auto")
plt.colorbar(mappable, ax=ax)
plt.show()
../_images/8a9cc0d92c636ef9901bb37012e21c631b7aebfddafce58e3d23a9593bcbde25.png

ax.pcolor()cmapオプションでカラーマップを指定できます。指定可能なカラーマップについては、以下のページも参照下さい。

Matplotlibのカラーマップ

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
mappable = ax.pcolor(theta3, r3, C, shading="auto", cmap="Blues")
plt.colorbar(mappable, ax=ax)
plt.show()
../_images/a8eed5b40e6ad631f53a168bc03333b6ccde68b68c5bff4d4cd9b0061acd14fd.png

参考#

Polar plot — Matplotlib documentation