まっしーの貯蔵庫

思考のゴミ箱

極座標のプロット

ブログの存在をすっかり忘れていた。
それくらいpythonを触っていないということだ。
しょうがない、今はペンを動かす方が楽しいんだから。

極座標でプロットする機会が増えた。
一ページにまとめたい。

ということで整理する。

前提として

import matplotlib.pyplot as plt

と、matplotlib.pyplotの潜在能力を呼び覚ましていることとする。

今回はr=(1+0.6cos(θ))**-1のグラフを描くことを目指す。楕円である。

ax=plt.subplot(111,projection="polar")

もしくは

plt.figure()
fig=plt.figure()
ax = fig.add_subplot(111,projection="polar")

projection="polar"で極座標になる。
いずれにせよ、subplotでプロットをしないといけない。んだろうか。僕はそうしてる。
ちなみに、111というのは「1行1列の行列の1つ目の要素にグラフを出力せよ」という命令である。例えば233なら「2行3列の行列の3つ目の要素にグラフを出力せよ」である。いくつ目の要素というのは、左上から右に、1行埋まったら下の行に移ってまた左から右に…という感じで考える。詳しくは他をググれ。

  • 範囲を指定する

デカルト座標系にプロットするときと同様である。僕は普段は

theta=np.arange(0,2*np.pi,0.1)
r=(1+0.6*cos(theta))**-1

という風に指定している。

θはラジアン単位で入力すること。
θはラジアン単位で入力すること。
θはラジアン単位で入力すること。

np.arangeのみならず、角度のリストを用いるときも同様。
実験データなどからわかった角度を、動径と一緒にプロットしたいときとかも同じ。その角度のデータが度数法で表記されているなら、π/180をかけるなどして変換しなければならない。
僕はこれで2日間を燃やしたことがある。

  • プロットする

ほぼ同じ。ただし、xのリスト・配列→yのリスト・配列とデカルト座標ではコードを書いていたから、それにならい、「角度(θ)、動径(r)」という順で書く。
つまり、θはx、rはyに当たるのだ。
なお、axメソッド(?)を指定してしまっているので、ax.plotを使わないといけない(のかな?)。

ax.plot(theta,r)
plt.show()

これで楕円のグラフはかける。

f:id:astro_massii:20161119234858p:plain

以下、極座標のグラフをいじりたい時のやり方。

  • 始線の方向を変える

角度0の方向をどちらに向けるか。デフォルトでは右を向いている。つまり数学Cの教科書通りだ。あ、今の時代は数学Cという概念がないのか。まあいいや。

これは

ax.axes.set_theta_zero_location("N")

で変える。ax~locationはただの呪文だ。英語だと思ってタイプしよう。
Nが重要。始線の方向は、東西南北の方位で設定する。今はNとしたので北、つまり上方向が角度0である。デフォルトから見ると角度90°がスタートになる。
他、Wなら左から、Sなら下からがスタートになる。たぶん、SEとかすると斜め右下45°方向がスタートになるのかなあ。やったことない。
とりあえず、東西南北をイメージすれば良い。

  • 時計回りにプロットしたい

デフォルトでは反時計回りにプロットするが、時計回りにすることもできる。
要するに、3時を基準にした場合、6時がπ/2(rad)、12時が3π/2(rad)としたい場合、である。
こんなことする場合あるの??と聞くかもしれないが、僕は一回、銀河座標系の絡みでプロットをする時に使ったことがある。

ax.set_theta_direction(-1)

により時計回りにプロットができる。

  • 動径、角度の範囲指定がしたい

上述したが、θはx、rはyに当たるのだ。なので、それで範囲指定する。

plt.xlim(0,np.pi/2) #角度方向の範囲指定
plt.ylim(3,5) #動径方向の範囲指定

ただし、動径方向を範囲指定するとドーナツ型のように真ん中がくり抜かれるとかではなく、中心がスタート(この場合は3)になるので、利用価値はない気がする。やってみると一目瞭然だろう。

他にも何かあれば追記する

最近は少しバイトが忙しいのだが、それに伴い若干感情的になっている気がする。
僕に感情はいらない。直したい。

参考文献
忘れた。
ただし、僕がpython極座標を扱ったパイオニアではないことは断言する。
僕もgoogle先生に大きく頼っている。
英語圏のstack overflowの皆様の書き込みは参考にした。
I appreciate for your advice for someone I do not know