iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
AI/ ML & Data

藉由 Python 介紹統計學與機器學習系列 第 8

Day 08:【Python 入門-8】單位圓與方形作圖

  • 分享至 

  • xImage
  •  

函數10:單位圓

人生第一次正式些觸到單位圓式在高中的時候,使用單位圓構成極坐標系介紹虛數 i=\sqrt{-1} ,與使用單位圓介紹三角函數。此次要藉著畫單位圓的過程學習畫圖技巧,順便回溫高中所學的圓形的數學表示式。

圓形的數學式如下圖,分別可以

  1. 圓上任一點到圓心距離固定,即 x, y 的平方和為一定值,
  2. 參數式, 其中 x, y 受半徑與角度控制,
  3. X 軸為界,分 y>0y<0 共 2 段

表示。分別使用不同圓形數學表示式來畫圖。

圓的數學表示式

10-1 單位圓 -- 參數式

使用參數式方法畫的單為圓如下,係以原點為中心,半徑為 1 的圖形。若要以參數式的方法畫圓,需設定圓的參數,例如:theta = np.linspace(0, 2 * np.pi, n)x = i * np.cos(theta)y = i * np.sin(theta)。之後用ax.spines 指令設定 X 軸與 Y 軸的位置或有無,此處選擇把原本靠左側與下側的框線其到中央,當作 X 軸與 Y 軸,再把上方與右方的框線拿除 。還有,記得要開始圖前,建議先以 fig = plt.figure(figsize=[4, 4]) 把圖片的長寬控制為相同,畫出來的圓才不會變成橢圓形的樣子。

# function 10: 單位圓

# 10-1 參數式 

n = 1000
r = [1] * 10
fig = plt.figure(figsize=[4, 4])

for i in r:
  # 0 to 2*pi
  theta = np.linspace(0, 2 * np.pi, n)
  x = i * np.cos(theta) # 參數式
  y = i * np.sin(theta)
  plt.plot(x, y, linewidth=3, color='#e48826')

ax = plt.gca()

# Re-arrange 4 axes spines
# 調整圖片 X 軸移至 0
ax.spines['left'].set_position(('data', 0))
# 調整圖片 Y 軸移至 0
ax.spines['bottom'].set_position(('data', 0))
# 拿掉右邊線
ax.spines['right'].set_visible(False)
# 拿掉上邊線
ax.spines['top'].set_visible(False)

ax.set_aspect(1)

# ax.set_xlim([-1.5, 1.5])
# ax.set_ylim([-1.5, 1.5])
plt.xlim([-1.5, 1.5])
plt.ylim([-1.5, 1.5])

plt.show()

單位圓 10-1-參數式

10-2 單位圓 -- 隱函數 + 等高線

第二種單位圓畫法為利用隱函數的特定,藉程式將圖形以等高線的形式呈現出來。Python 程式法如下,在畫圖前,先定義半徑長度、畫圖的範圍、隱函數。其中畫圖的範圍比較特別,先 np.linspace(-r, r, 1000) 生成*-r* 到 r 之間無數的位置。之後,以 np.meshgrid(x, y) 把原本分開的 x, y 編織成相連的網狀矩陣。把矩陣中的元素平方並將矩陣相加、減去半徑的平方,得到等一下畫等高線所使用的「高度」。最後,利用plt.contour(*) 畫高度為 1 的等高線,神奇的是,其恰好為一個單位圓!

# 10-2 隱函數 + 等高線

# 圓半徑
r = 1

x = np.linspace(-r, r, 1000)
y = np.linspace(-r, r, 1000)
X, Y = np.meshgrid(x, y)

# 定義隱函數 
Z = X**2 + Y**2 - r**2

# 利用等高線畫隱函數
plt.figure(figsize=[4, 4])
plt.contour(X, Y, Z, levels=[0], colors=['#e48826',], linewidths=[3,])

plt.xticks(np.arange(-1.5, 1.5+0.5, 0.5))
plt.yticks(np.arange(-1.5, 1.5+0.5, 0.5))
# plt.xlim([-1.5, 1.5])
# plt.ylim([-1.5, 1.5])
plt.title(r'Plot of the Implicit Function $x^2 + y^2 - 1 = 0$')
plt.grid(True)

plt.show()

單位圓 10-2-隱函數 + 等高線

10-3 單位圓 -- 極座標投影

圓形不只可以常見的直角座標系表示,也可借極座標表示。極座標與直接座標的詳細介紹可以參考
師大范洪源老師的簡報。不過,這些不是本篇的重點,重點為使用極座標畫圖的方法。

首先,定義角度 theta 與半徑長 rho。之後,設置極座標係 ax = plt.subplot(111, projection='polar') ,其中 111 依序為列、行、子圖,使用 projection='polar' 設定為以極座標投影標的。最後,利用在極座標下,以角度 theta 與長度 rho 畫出圓形。

# 10-3 極座標投影

theta = np.linspace(0, 2 * np.pi, 1000) # 0 到 2pi
rho = 1  # 圓半徑

plt.figure(figsize=[4, 4]) # 繪圖窗口
ax = plt.subplot(111, projection='polar') # 極座標系

# -------------------------
# 以上等價於:
# fig, ax = plt.subplots(figsize=[4, 4], subplot_kw=dict(projection='polar'))
# -------------------------

ax.plot(theta, rho * np.ones_like(theta), color='#e48826', linewidth=3)
ax.set_title(r'Polar Plot $x^2 + y^2 - 1 = 0$', va='bottom')

plt.show()

單位圓 10-3 極座標投影

10-4 單位圓 -- 以 X 軸為界線,分兩段畫圖

第 4 種畫單位圓的方法為我們最初學習到圓形的數學表示法,即以 y 大於 0y 小於 0 分界畫圖。

# 10-4 分做 y>0 y<0 兩段
# y = sqrt(1 - x^2), if x >= 0 
# y = -sqrt(1 - x^2), if x < 0

def f(x):
  return np.sqrt(1 - np.square(x)) 

r = 1
x = np.linspace(-r, r, 100)

# 分上下兩段畫圓
plt.figure(figsize=[4, 4])
plt.plot(x, f(x), color='#e48826', linewidth=3)
plt.plot(x, -f(x), color='#e48826', linewidth=3)

# 空心圓
plt.plot(r, 0, 'o', markeredgecolor = (1, 0, 0.2, 1) \
         , markerfacecolor=(0, 0, 0, 0), 
         markersize=9)
plt.plot(-r, 0, 'o', markeredgecolor = (1, 0, 0.2, 1) \
         , markerfacecolor=(0, 0, 0, 0), 
         markersize=9)

plt.xlim([-1.5, 1.5])
plt.ylim([-1.5, 1.5])

plt.title(r'Plot of $2$ Functions $y = \pm \sqrt{1 - x^2}$')
plt.grid(True)

plt.show()

10-4 分做 y&gt;0 y&lt;0 兩段

正方形

11 正方形


參考資料:


上一篇
Day 07:【Python 入門-7】作圖實例
下一篇
Day 09:【統計概念-1】藉 Python 模擬機率分布與隨機亂數
系列文
藉由 Python 介紹統計學與機器學習31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言