《scikit-learn機器學習常用算法原理及編程實戰》—2.5.3 畫圖操作
2.5.3? 畫圖操作
本節通過一系列的例子,來演示Matplotlib的畫圖操作。首先給出最終的圖形,接著解釋思路及用到的關鍵函數,讀者可以先試著思考如何實現,對于用到的關鍵接口,可以通讀一下Matplotlib相關接口的文檔。所有的示例代碼均包含在隨書代碼ch02.05.ipynb中,讀者可以試著改變一些參數,以便學習這些參數的用法。
在圖2-15中左圖是使用plt.scatter()函數畫出來的,需要特別關注命名參數c的使用。方法是生成一定數量的隨機點,計算隨機點的反正切np.arctan2(Y, X),把這個值作為隨機點的顏色。
n = 1024
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
T = np.arctan2(Y, X)
plt.subplot(1, 2, 1)
plt.scatter(X, Y, s=75, c=T, alpha=.5)
plt.xlim(-1.5, 1.5)
plt.xticks(())
plt.ylim(-1.5, 1.5)
plt.yticks(())
圖2-15? 畫點與填充
對于圖2-15中的右圖,是使用plt.fill_between()函數來填充的,需要特別關注命名參數where的使用。先畫出兩條正弦曲線,在x = 0這條直線和正弦曲線之間填充指定的顏色。
n = 256
X = np.linspace(-np.pi, np.pi, n, endpoint=True)
Y = np.sin(2 * X)
plt.subplot(1, 2, 2)
plt.plot(X, Y + 1, color='blue', alpha=1.00)
plt.fill_between(X, 1, Y + 1, color='blue', alpha=.25)
plt.plot(X, Y - 1, color='blue', alpha=1.00)
plt.fill_between(X, -1, Y - 1, (Y - 1) > -1, color='blue', alpha=.25)
plt.fill_between(X, -1, Y - 1, (Y - 1) < -1, color='red',? alpha=.25)
plt.xlim(-np.pi, np.pi)
plt.xticks(())
plt.ylim(-2.5, 2.5)
plt.yticks(())
如圖2-16左圖,使用 plt.bar()函數來畫出柱狀圖,留意命名參數facecolor和edgecolor的使用。生成24個隨機值,調用兩次plt.bar()函數分別畫在上下兩側。再調用plt.text()函數把數值畫在對應的柱狀圖上。
n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
plt.subplot(1, 2, 1)
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
for x, y in zip(X, Y1):
plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va= 'bottom')
for x, y in zip(X, Y2):
plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va= 'top')
plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())
圖2-16? 柱狀圖的等高線
如圖2-16右圖所示,使用plt.contourf()函數填充等高線,其中命名參數cmap表示顏色映射風格。數接著用plt.contour()函數畫出等高線。需要留意np.meshgrid()函數的用法。最后使用plt.clable()函數畫出等高線上的數字。
def f(x,y):
return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y)
plt.subplot(1, 2, 2)
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=1, fontsize=10)
plt.xticks(())
plt.yticks(())
如圖2-17左圖所示,使用plt.imshow()函數把數組當成圖片畫出來,命名參數cmap用來決定數組到顏色的映射網格。最后使用plt.colorbar()函數畫出顏色條。
圖2-17? 熱成像圖及餅圖
def f(x, y):
return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
plt.subplot(1, 2, 1)
n = 10
x = np.linspace(-3, 3, 4 * n)
y = np.linspace(-3, 3, 3 * n)
X, Y = np.meshgrid(x, y)
plt.imshow(f(X, Y), cmap='hot', origin='low')
plt.colorbar(shrink=.83)
plt.xticks(())
plt.yticks(())
如圖2-17右圖所示,使用plt.pie()函數畫出餅圖,總共有20個餅圖,其中19個是等角度的扇形,最后一個突出的扇形是其他扇形角度的兩倍,使用命名參數explode來實現這個效果。各個扇形的填充顏色逐漸變深,使用命名參數colors來實現這個效果。
plt.subplot(1, 2, 2)
n = 20
Z = np.ones(n)
Z[-1] *= 2
plt.pie(Z, explode=Z*.05, colors = ['%f' % (i/float(n)) for i in range(n)])
plt.axis('equal')
plt.xticks(())
plt.yticks()
如圖2-18左圖所示,使用坐標軸的set_major_locator()和set_minor_locator()方法把坐標刻度設置成MultipleLocator樣式。然后再使用坐標軸的grid()函數在坐標軸的刻度之間畫上線段,這樣就生成了我們需要的網格。
ax = plt.subplot(1, 2, 1)
ax.set_xlim(0,4)
ax.set_ylim(0,3)
ax.xaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))
ax.yaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.yaxis.set_minor_locator(plt.MultipleLocator(0.1))
ax.grid(which='major', axis='x', linewidth=0.75, linestyle='-', color=
'0.75')
ax.grid(which='minor', axis='x', linewidth=0.25, linestyle='-', color=
'0.75')
ax.grid(which='major', axis='y', linewidth=0.75, linestyle='-', color=
'0.75')
ax.grid(which='minor', axis='y', linewidth=0.25, linestyle='-', color=
'0.75')
ax.set_xticklabels([])
ax.set_yticklabels([])
圖2-18? 網格及極坐標圖
如圖2-18右圖所示,使用plt.bar()和bar.set_facecolor()來填充不同的顏色。其中一個關鍵點是在創建子圖或坐標軸時,需要指定polar=True才能顯示出極坐標圖。
ax = plt.subplot(1, 2, 2, polar=True)
N = 20
theta = np.arange(0.0, 2 * np.pi, 2 * np.pi / N)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
bars = plt.bar(theta, radii, width=width, bottom=0.0)
for r,bar in zip(radii, bars):
bar.set_facecolor(plt.cm.jet(r/10.))
bar.set_alpha(0.5)
ax.set_xticklabels([])
ax.set_yticklabels([])
Matplotlib有大量的細節,完整的教程都可以寫一本書。本書用到的知識不會特別復雜,掌握這些基本的知識就足夠用了。如果想深入學習Matplotlib,可以訪問官方網站 matplotlib.org。
機器學習 scikit-learn
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。