使用極座標系統
有別於常見的直角座標標系統 ( 笛卡兒座標、xy 座標 ),matplotlib 也可將座標系統設置為「極座標系統」,設置為極座標後,圖表也會採用對應的顯示方式顯示,這篇教學將會介紹如何使用極座標系統。
快速導覽
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
import matplotlib
要進行本篇的範例,必須先載入 matplotlib 函式庫的 pyplot 模組,範例將其獨立命名為 plt。
import matplotlib.pyplot as plt
什麼是極座標系統?
極座標系統 ( Polar coordinate system ) 是一個二維座標系統。座標系統中的任意位置,均可由一個夾角和一段相對原點的距離來表示。極座標的應用領域十分廣泛,包括數學、物理、工程、航海、航空、電腦以及機器人領域。
極座標系統中的角度通常表示為角度或者弧度,使用公式 2π rad= 360° 進行轉換,至於要使用哪一種單位,基本都是由使用場合而定。航海方面經常使用角度來進行測量,而物理學的某些領域則更傾向使用弧度。
顯示極座標系統
如果使用 fig = plt.figure()
的方式建立圖表,只要額外設定 projection='polar'
或 polar=True
,就能將座標系統設定為極座標系統。
import matplotlib.pyplot as plt
x = range(5)
y = [7,8,5,12,6]
fig = plt.figure()
plt.subplot(projection='polar') # 設定 projection='polar'
# plt.subplot(polar=True) # 設定 polar=True 也可以
plt.bar(x,y)
plt.show()
這種做法支援不同的子圖表,採用不同的座標系統,下方的程式碼執行後,左邊的圖表使用極座標,右邊的圖表使用直角坐標。
import matplotlib.pyplot as plt
x = range(0,360,72)
y1 = [7,8,5,12,6]
y2 = [12,8,7,11,4]
fig = plt.figure()
fig.set_size_inches(10,6)
plt.subplot(121,projection='polar') # 設定 projection='polar'
# plt.subplot(121,polar=True) # 設定 polar=True 也可以
plt.bar(x,y1)
plt.subplot(122)
plt.bar(x,y2)
plt.show()
如果是使用 fig, ax = plt.subpolts()
的方式建立圖表,則需要透過 subplot_kw 參數將 projection 提供給每個座標軸。
import matplotlib.pyplot as plt
x = range(5)
y1 = [7,8,5,12,6]
y2 = [12,8,7,11,4]
fig, ax = plt.subplots(1,2,subplot_kw={'projection': 'polar'}) # 設定 subplot_kw 參數
fig.set_size_inches(10,6)
ax[0].bar(x,y1)
ax[1].bar(x,y2)
plt.show()
極座標使用的單位
極座標系統使用「弧度」作為單位,因此顯示數值時,需要將「角度」轉換成「弧度」,下方的程式碼透過 Python 標準函式庫 math 裡的 radians 方法,進行角度弧度的轉換。
import matplotlib.pyplot as plt
import math
x = [math.radians(i) for i in range(0,360,72)] # 轉換成弧度後變成串列,每 72 度為一單位
y = [7,8,5,12,6]
fig = plt.figure()
fig.set_size_inches(6,6)
plt.subplot(projection='polar')
plt.bar(x,y)
plt.show()
極座標的顯示設定
下方列出設定座標軸 ax 的常用方法,透過這些方法修改極座標系統的格線、最大值、最小值...等顯示設定:
方法 | 參數 | 說明 |
---|---|---|
set_thetagrids | angles, labels | 設定放射狀隔線,間隔單位角度,angles 和 labels 使用 tuple 格式。 |
set_rgrids | list | 設定圓周隔線,使用串列格式。 |
set_theta_direction | direction | 旋轉方向,預設 1 為逆時針,設定 -1 為順時針。 |
set_theta_zero_location | loc | 設定 0 度的位置,預設 E ( 東邊、右邊 ),可設定 N、NW、W、SW、S、SE、E、NE。 |
set_rlim | min, max | 數值範圍。 |
set_thetalim | min, max | 極座標顯示範圍,直接使用 ( min, max ) 單位是弧度,使用 (thetamin=min, thetamax=max) 單位則是角度。 |
set_thetamin | min | 極座標顯示範圍的最小值,單位角度。 |
set_thetamax | max | 極座標顯示範圍的最大值,單位角度。 |
import matplotlib.pyplot as plt
import math
x = [math.radians(i) for i in range(0,360,72)] # 角度轉成弧度
y = [7,8,5,12,6]
fig = plt.figure()
fig.set_size_inches(14,8)
ax1 = plt.subplot(131,projection='polar') # 套用預設值的圖表
ax1.set_title('ax1',pad=15,fontsize=20)
ax1.bar(x,y)
ax2 = plt.subplot(132,projection='polar') # 修改旋轉方向的圖表
ax2.set_title('ax2',pad=15,fontsize=20)
ax2.set_theta_direction(-1) # 改成順時針
ax2.bar(x,y)
ax3 = plt.subplot(133,projection='polar') # 調整顯示樣式的圖表
ax3.set_title('ax3',pad=15,fontsize=20)
ax3.bar(x,y)
ax3.set_rlim(0,15) # 設定數值顯示範圍
ax3.set_theta_zero_location('N') # 設定 0 度的位置
ax3.set_thetamin(0) # 設定顯示最小角度
ax3.set_thetamax(270) # 設定顯示最大角度
ax3.set_thetagrids(range(0,360,72)) # 設定放射狀隔線
ax3.set_rgrids(range(0,20,5)) # 設定圓周隔線
plt.show()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~