範例 1:繪製函數圖形
注意事項:
開始使用 matplotlib 套件
基本的函數繪製方法:
先設定 n 個 x 值(向量)np.linspace()
計算每個 x 值的函數值 y (向量)
繪製 n 個座標 (x, y)
使用了座標區 AXIS 的格線,加入 x 軸與 Y 軸的標籤文字
加入抬頭 title 並以 $\LaTeX$ 的數學式呈現
import matplotlib.pyplot as plt
import numpy as np
n = 100 # number of points
# create a x vector by number
x = np.linspace(-5, 5, n)
# compute y
y = x**2 + 3*x + 5
plt.plot(x, y)
plt.grid(True)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('$f(x)=x^2+3x+5$')
plt.show()
範例 2:繪製函數圖形
注意事項:
使用 np.arange() 定義 X 變數值
使用 numpy 的匿名函數定義(anonymous function): lambda.
使用 plt.figure() 先建立空白圖形並預先設定圖形長寬規格
開始加入函數線條的變化,如線的型態(linestyle)與顏色(color)
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 7, 0.01)
# formulate a function f
f = lambda x : x**3 - 10*x**2 + 29*x - 20
fig = plt.figure(figsize=[6, 4])
plt.plot(x, f(x), linestyle = '--', color = 'r')
plt.grid(True)
plt.xlabel('X'), plt.ylabel('Y')
plt.title('$f(x)=x^3-10x^2+29x-20$')
plt.show()
範例 3:繪製函數圖形
注意事項:
繪製函數圖形必須留意 X 變數的範圍,方能呈現出函數的內涵,譬如相對與絕對極值、函數是否與 y=0 相切、漸近線…等。譬如,下方附圖刻意示範一個不好的 X 值範圍,造成中間可能存在函數豐富的變化,卻被兩邊非常大的函數值「剷平」(視覺上),因此必須在縮小範圍,直到浮現函數該有的面貌為止。
使用 numpy 的 polyval 計算多項式函數值,讓程式更簡潔。
使用圖形的座標軸物件(ax=plt.gca())來繪製函數圖(ax.plot()),有別於前面範例使用圖形物件 plt.plot()
加入函數線的寬度(linewidth)與 plt.text() 在座標區域內加入文字或數學式
加入儲存圖形檔的指令,並示範以 eps 格式儲存.
import matplotlib.pyplot as plt
import numpy as np
xmin, xmax = -5, 10
x = np.linspace(xmin, xmax, 100)
p = [1, -8, 16, -2, 8]
f = lambda x : np.polyval(p, x)
fig = plt.figure()
# use axis object
ax = plt.gca() # get current axis
ax.plot(x, f(x), linewidth = 3, color ='g', linestyle ='-.')
ax.grid(True)
ax.set_xlabel('X'), ax.set_ylabel('f(x)')
ax.set_title('The range of $x$ is not appropriate')
ax.text(0, 2500, 'Re-define the range of $x$')
# save the current figure as an eps file
plt.savefig('poly.eps', format='eps')
plt.show()
練習 : 繪製函數圖形
注意事項:
初學者應先模仿前面的範例程式,試著自己 coding。
這個函數有無線項次,開始寫程式時,最好一項一項加進來執行繪圖,成功了,再來學習本範例程式碼示範的迴圈。
再實務面上,不可能做到無限項次,而是代之以足夠數量的有限項次。
使用 “plt.pause(秒數)” 示範當項次增加時,以時間暫留表現出動畫的感覺。請注意,時間暫留不適合 jupyter notebook 的檔案與執行環境。程式副檔名必須是 .py。
初學者第一次碰到沒用過的數學函數與常數如 of and
,最好上網至官網(numpy)查詢,學習看懂使用說明,並學習官網的範例。
示範利用座標區物件來設定特定的 X 軸刻度(xtick) 與刻度的代表文字( ticklabel),請注意:X 軸刻度與刻度的代表文字無法以 plt 設定。下列程式碼以 plt.subplots(1) 取得座標區物件。
加入調整 Y 軸座標範圍的指令 ax.set_ylim 或 plt.ylim()
import numpy as np
import matplotlib.pyplot as plt
# The codes below demonstrate the ticks and labels in x axis
x = np.linspace(-3*np.pi, 3*np.pi,200)
y = 4 / np.pi * np.sin(x)
fig, ax = plt.subplots(1)
ax.plot(x, y, color='b')
ax.set_xticks(np.array([-3, -2, -1, 0, 1, 2, 3])*np.pi)
ax.set_xticklabels(['-3$\pi$', '-2$\pi$', '$\pi$', '0', '$\pi$','2$\pi$','3$\pi$'], \
fontsize=10, color = 'b')
ax.set_ylim([-3, 3])
ax.grid(True)
plt.show()
範例 4: 將下列三個函數繪製在同一個座標區並以 legend 標示區別。
注意事項:
由於上述函數具規則性,因此可以用迴圈繪製。
示範在迴圈中加入每個線條的顏色。顏色必須先設定。
示範如何在繪製每個圖形時,使用標籤 label 文字,才能在最後加入 plt.legend() 呈現圖形說明文字。
程式也示範如何在迴圈中組合文字與動態的數字, 如 label = ‘sin({}x)’.format(i).
import numpy as np
import matplotlib.pyplot as plt
n = [1, 2, 3]
colors = ['r', 'g', 'b']
x = np.linspace(-3*np.pi, 3*np.pi, 200)
for i in n: # always start with a colon
y=np.sin(i*x) #blocks of code are identified by indentation
plt.plot(x, y, label = 'sin({}x)'.format(i), \
color = colors[i - 1])
plt.legend()
plt.ylim(-2.5, 2.5), plt.grid(True), plt.xlabel('X')
plt.title('Demonstration of legend for each line')
plt.show()
範例 5: 繪製補滿(patch)顏色的多邊形
注意事項:
這裡使用了 matplotlib 套件中的 patches 模組。模組裡有一個指令 Rectangle 能畫出長方形。若要畫多邊形,請參考 matplotlib 使用手冊關於 polygon 的使用方式。
關於 Rectangle 的使用方式,可以根據程式碼與圖形結果去猜測。若想進一步了解,立刻翻閱手冊。
下圖的顏色搭配了透明度(transparency),呈現半透明(alpha=0.5)。請試著改變透明度,看看其他效果。
import matplotlib.pyplot as plt
import matplotlib.patches as pat
fig, ax = plt.subplots(figsize=(4,3))
rec1 = pat.Rectangle((1, 1), 2, 3, color ='green', alpha = 0.5)
ax.add_patch(rec1)
rec2 = pat.Rectangle((2, 2), 2, 3, color ='red', alpha = 0.5)
ax.add_patch(rec2)
plt.xlim([0,5]), plt.ylim([0,6])
plt.show()
範例 6: 繪製下列兩個函數圖,並函數所夾的區域塗上顏色
注意事項:
這是微積分常見的題目。請任選微積分課本的題目,練習為兩函數包圍的區域塗上顏色。盡量挑選有挑戰性的函數,程式技巧才會進步。
指令 fill_between 的語法,請自行從指令中猜測。並且嘗試做出各種選項(呈現包圍之外的區域)。
這個程式也示範了如何調整座標區的四個座標軸(上下左右)。使用方式請自行猜測,並嘗試改變並觀察結果。
本程式也示範了在座標區域寫上數學式並拉一條帶箭頭的標示線只到特地位置 的 annotate 技巧。
座標區可以交由 ax.set_facecolor 控制顏色。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-0.5, 1.6, 100)
f = lambda x : 2*x - x**2
g = lambda x : x**2
plt.plot(x, f(x), x, g(x)) # draw two lines in a command
plt.fill_between(x, f(x), g(x), where = f(x) > g(x), color = 'pink') # defaut : y1>y2
ax = plt.gca()
# Re-arrange four axes spines
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
ax.spines['top'].set_visible(False) # take off top line
ax.spines['right'].set_visible(False)
ax.set_facecolor('#D5FAF9')
ax.annotate('$\int_0^1 (f(x) - g(x)) \; dx$', \
xy=(0.5, 0.5), xytext=(0.3, 1.5), \
arrowprops=dict(arrowstyle='->', \
connectionstyle='arc3, rad=0.3'), fontsize =14)
plt.show()
習題 :
注意事項:
畫出下列函數,X 軸範圍自訂,盡量畫出最完整的函數圖,能呈現隱藏在函數的資訊。
將上述範例介紹的繪圖技巧充分地應用,讓自己熟悉各種繪圖的表現,包括文字、刻度、顏色、legend、grid、座標軸的位置… 等。不是只將函數畫出來而已,還要畫得好。有些函數需要的指令不再前面的範例,請自行上網查詢手冊。
圖形如下左圖。畫圓可以這樣做:
第一種方法:將變數 x 與 y 表示為另一個變數的函數, i.e.
第二種方法:將圓形方程式當作隱函數(implicit function)處裡。必須找到適當的指令。
第三種方法:去 matplotlib 套件的手冊找找看,有沒有畫圓的指令。
但不管採取何種方式,最後都要將座標軸設定為等寬模式,看到的圓才比較「圓」,否則即使做對了,看起來還是像橢圓。如果採座標區物件的繪圖方式,可以用指令 ax.set_aspect(1) 將座標區域變成方形。
繪製如下右圖的正方形。