Posted at

matplotlib 極座標グラフについてあれこれ

環境

OS : macOS Mojave

Anaconda : python3.6.7

matplotlib : 2.2.2


イントロ

大学の研究で極座標グラフを用いて極点図(pole figure)を書く必要があったが、なかなか情報がないので調べたことをまとめておく


極座標グラフの基本

基本的なコードとしては


ex_polar.py

import matplotlib.pyplot as plt

import numpy as np

r = 0.5
theta = 45
theta_rad = np.deg2rad(theta)

ax=plt.subplot(projection="polar")
ax.scatter(theta_rad, r, c="red", s =15)


基本的にはこんな感じ

matplotlibやnumpyのsin,cosなどPythonの計算の入力はラジアンが基本

上のサンプルコードでは、r=0.5, θ=45の点を打ちたいのでいったんnp.deg2rad()関数で度⇒radに変換

次に、本題のプロットは

軸設定(この表現が正しいかは?, とりあえずax=plt.subplot...のところのこと)の際に引数でprojection="polar"にすることで極座標グラフにできる

点を打ったり、線をひっぱたりするのは通常の直交座標と同じ関数、今回は散布図のプロットなのでax.scatter

このとき、引数に注意する。口ではr-θなどというが、引数の順番はθ-r

残りのオプション(色や、プロットサイズなど)は通常の直交座標と同じ

と、ここまでは公式のページなどを見ればだいたい分かる


軸のカスタム

ここからは軸のカスタム設定について


ex.py

ax.set_rlim([0, 1])

ax.set_rticks([0, 1])
ax.set_yticklabels([])
tickpos = np.linspace(0, 2 * np.pi, 4, endpoint=False)
plt.xticks(tickpos, ["100", "010", "-100", "0-10"])

カスタム部分だけ取り出したのが上のコード

これは今回、僕が使っている部分だけなので他にもθの表示範囲などがあるので興味があったら調べてみてください

ぱっと見てrとx,yが混在しているのは試行錯誤した結果です。(もっといい方法があったら教えてください)

set_rticksは軸の目盛りの間隔です。

ただ今回は、ラベルはひょうじしたくないのでax.set_yticklabels([])で表示なしに(おそらくyは2個目の引数であるrに対応していると思われます。)

set_rlimは完全にrの表示範囲を指定するときに使います。今回はax.set_rlim([0, 1])としているのでr=0からr=1までがグラフで表示される。

最後の二行は、θ(xに対応)を4分割しそれぞれ軸の目盛りを設定している

これはplt.で始まっているがax.set_rlim([0, 1])とax.set_rticks([0, 1])のθ版を合体させたものだと考えられる。

いろいろ調べながらやったのでax.やplt.が混在する形になってしまったがとりあえずこれを使ってうまくやっている。

もし、みなさんの参考になれば幸いです。

ご意見あればよろしくお願いします。