《scikit-learn機器學習常用算法原理及編程實戰》—2.5 Matplotlib簡介
2.5? Matplotlib簡介
Matplotlib是Python數據可視化工具包。IPython為Matplotlib專門提供了特殊的交互模式。如果要在IPython控制臺使用Matplotlib,可以使用ipython --matplotlib命令來啟動IPython控制臺程序;如果要在IPython notebook里使用Matplotlib,則在notebook的開始位置插入%matplotlib inline魔術命令即可。IPython的Matplotlib 模式有兩個優點,一是提供了非阻塞的畫圖操作,二是不需要顯式地調用show()方法來顯示畫出來的圖片。
Matplotlib下的pyplot子包提供了面向對象的畫圖程序接口。幾乎所有的畫圖函數都與MATLAB類似,連參數都類似。在實際開發工作中,有時候甚至可以訪問MATLAB的官方文檔cn.mathworks.com/help/matlab來查詢畫圖的接口和參數,這些參數可以直接在pyplot下的畫圖函數里使用。使用pyplot的習慣性寫法是:
from matplotlitb import pyplot as plt
在機器學習領域中,我們經常需要把數據可視化,以便觀察數據的模式。此外,在對算法性能進行評估時,也需要把模型相關的數據可視化,才能觀察出模型里需要改進的地方。例如,我們把算法的準確度和訓練數據集大小的變化曲線畫出來,可以清晰地看出訓練數據集大小與算法準確度的關系。這就是我們需要學習Matplotlib 的原因。
2.5.1? 圖形樣式
通常使用IPython notebook的Matplotlib模式來畫圖,這樣畫出來的圖片會直接顯示在網頁上。要記得在notebook的最上面寫上魔術命令%matplotlib inline。
使用Matplotlib的默認樣式在一個坐標軸上畫出正弦和余弦曲線:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-np.pi, np.pi, 200)
C, S = np.cos(x), np.sin(x)
plt.plot(x, C)? ? ? ? ? ? ? ? ? ? ? # 畫出余弦曲線
plt.plot(x, S)? ? ? ? ? ? ? ? ? ? ? # 畫出正弦曲線
plt.show()
接著,通過修改Matplotlib的默認樣式,畫出我們需要的樣式圖片。如圖2-8左側為默認樣式畫出來的正余弦曲線,右側為調整后的正余弦曲線。
圖2-8? 正弦余弦曲線
接下來,我們演示逐步從左側圖片過渡到右側圖片的過程。
(1)把正余弦曲線的線條畫粗,并且定制合適的顏色:
# 畫出余弦曲線,并設置線條顏色,寬度,樣式
plt.plot(X, C, color="blue", linewidth=2.0, linestyle="-")
# 畫出正弦曲線,并設置線條顏色,寬度,樣式
plt.plot(X, S, color="red", linewidth=2.0, linestyle="-")
(2)設置坐標軸的長度:
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.1, C.max() * 1.1)
(3)重新設置坐標軸的刻度。X軸的刻度使用自定義的標簽,標簽的文本使用了LaTeX來顯示圓周率符號π。
# 設置坐標軸的刻度和標簽
plt.xticks((-np.pi, -np.pi/2, np.pi/2, np.pi),
(r'$-\pi$', r'$-\pi/2$', r'$+\pi/2$', r'$+\pi$'))
plt.yticks([-1, -0.5, 0, 0.5, 1])
(4)把左側圖片中的4個方向的坐標軸改為兩個方向的交叉坐標軸。方法是通過設置顏色為透明色,把上方和右側的坐標邊線隱藏起來。然后移動左側和下方的坐標邊線到原點(0, 0)的位置。
# 坐標軸總共有4個連線,我們通過設置透明色隱藏上方和右方的邊線
# 通過 set_position() 移動左側和下側的邊線
# 通過 set_ticks_position() 設置坐標軸的刻度線的顯示位置
ax = plt.gca()? ? ? ? ? ? ? ? # gca 代表當前坐標軸,即 'get current axis'
ax.spines['right'].set_color('none')? ? ? ? ? ? # 隱藏坐標軸
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')? ? ? ? ? ? # 設置刻度顯示位置
ax.spines['bottom'].set_position(('data',0))? ? # 設置下方坐標軸位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))? ? ? # 設置左側坐標軸位置
(5)在圖片的左上角添加一個銘牌,用來標識圖片中正弦曲線和余弦曲線。
plt.legend(loc='upper left')
(6)在圖片中標識出。不但把這個公式畫到圖片上,還在余弦曲線上標識出這個點,同時用虛線畫出這個點所對應的X軸的坐標。
t = 2 * np.pi / 3
# 畫出 cos(t) 所在的點在 X 軸上的位置,即使用虛線畫出 (t, 0) -> (t, cos(t)) 線段
plt.plot([t, t], [0, np.cos(t)], color='blue', linewidth=1.5, linestyle="--")
# 畫出標示的坐標點,即在 (t, cos(t))處畫一個大小為50的藍色點
plt.scatter([t, ], [np.cos(t), ], 50, color='blue')
# 畫出標示點的值,即 cos(t) 的值
plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
其中,plt.annotate()函數的功能是在圖片上畫出標示文本,其文本內容也是使用LaTex公式書寫。這個函數參數眾多,具體可參閱官方的API說明文檔。使用相同的方法,可以在正弦曲線上也標示出一個點。
(7)定制坐標軸上的刻度標簽的字體,同時為了避免正余弦曲線覆蓋掉刻度標識,在刻度標簽上添加一個半透明的方框作為背景。
# 設置坐標刻度的字體大小,添加半透明背景
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(16)
label.set_bbox(dict(facecolor='white', edgecolor='None',
alpha=0.65))
這樣就完成了一個Matplotlib樣式配置的過程,把默認的樣式修改成我們需要的樣式。讀者可參閱隨書代碼ch02.04.ipynb。
機器學習 scikit-learn
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。