大師兄的Python機器學習筆記:Numpy庫、Scipy庫和Matplotlib庫(二)
大師兄的Python機器學習筆記:數(shù)據(jù)預處理
四、Matplotlib庫
1. Matplotlib庫的功能
- 用于實現(xiàn)數(shù)據(jù)可視化功能。
- 可以實現(xiàn)各種圖表的繪制、如條形圖,散點圖,條形圖,餅圖,堆疊圖,3D 圖和地圖圖表。
- Matplotlib庫需要單獨安裝,指令為:
pip install matplotlib。
2. 實現(xiàn)簡單的視圖
2.1 matplotlib.pyplot
-
matplotlib.pyplot是一個函數(shù)集合,其風格與MATLAB相似。 - 基于慣例,我們通常將
matplotlib.pyplot導入為plt
2.2 plt.plot(x,y,format_string, **kwargs)
- 根據(jù)坐標繪制圖標。
- x,y分表代表x軸、y軸,可以是列表或數(shù)組(ndarray)。
- format_string 為控制曲線的格式字符串,由 顏色字符、風格字符和標記字符組成:
| 字符串 | 案例 |
|---|---|
| 顏色字符 | 'b' : 藍色 '#008000' : RGB顏色 0.8 : 灰度值字符串 |
| 風格字符 | '-' : 實線 '--' : 破折線 '-.' : 點劃線 ':' : 虛線 '' : 無線條 |
| 標記字符 | '.' : 點標記 'o' : 實心圈 'v' : 倒三角 '^' : 上三角 |
- **kwargs 表示更多條線的參數(shù)。
2.3 plt.show()
- 根據(jù)配置和值繪制出視圖。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":")
>>>plt.show()

2.4 plt.subplots()
- 返回Figure對象和Axes(數(shù)組)對象。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":")
>>>fig,ax = plt.subplots()
>>>print("Figure:",fig)
>>>print("Axes:",ax)
Figure: Figure(432x288)
Axes: AxesSubplot(0.125,0.125;0.775x0.755)
3. 環(huán)境配置
3.1 圖標
- 在
plt.plot()函數(shù)中增加參數(shù)label。 - 使用
plt.legend()生成圖例。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label sample")
>>>plt.legend() # 生成圖例
>>>plt.show()

3.2 標題
- 使用plt.title()添加標題。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label sample")
>>>plt.title('sample title')
>>>plt.legend()
>>>plt.show()

3.3 標簽
- 使用
plt.xlabel()和plt.ylabel()為x軸、y軸添加標簽。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label sample")
>>>plt.title('sample title')
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

3.4 網(wǎng)格線
- 通過
plt.grid()增加網(wǎng)格線,參數(shù):
| 參數(shù) | 意義 | 值 |
|---|---|---|
| b | 是否顯示網(wǎng)格線 | True / False |
| which | 模式 | 'major' / 'minor' / 'both' |
| axis | 繪制哪個方向的網(wǎng)格線 | 'both' / 'x' / 'y' |
| color/c | 顏色 | 各種顏色的首字母 |
| linestyle/ls | 網(wǎng)格線風格 | '-' / '--' / '-. / ':' / 'None' / ' ' |
| linewidth | 網(wǎng)格線寬度 | 數(shù)字 |
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label sample")
>>>plt.title('sample title')
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.grid(b=True,which='major',linewidth=0.5)
>>>plt.legend()
>>>plt.show()

3.5 中文顯示
- matplotlib需要通過配置
plt.rcParams參數(shù)正常顯示中文。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label樣式")
>>>plt.rcParams['font.sans-serif']=['SimHei'] # 配置字體
>>>plt.rcParams['axes.unicode_minus']=False # 正常顯示符號
>>>plt.title('中文標題')
>>>plt.xlabel('x軸')
>>>plt.ylabel('y軸')
>>>plt.grid(b=True,which='major',linewidth=0.5)
>>>plt.legend()
>>>plt.show()

4. 圖標類型
4.1 條形圖
- 用
plt.bar()函數(shù)繪制條形圖。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.bar(x,y,label= 'sample1')
>>>plt.bar(y,x,label= 'sample2',color='g')
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

4.2 直方圖
- 用
plt.hist()函數(shù)繪制條形圖。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>data = np.random.random_integers(100,size=(100))
>>>bins=np.array(range(0,100,10))
>>>plt.hist(data,bins,histtype='bar',rwidth=0.8)
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

4.3 散點圖
- 用
plt.scatter()函數(shù)繪制散點圖。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.scatter(x,y,label='sample',color='b',s=20,marker="o")
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

4.4 堆疊圖
- 用
plt.stackplot()函數(shù)繪制堆疊圖。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>data1 = np.array([1,3,5,7,9])
>>>data2 = np.array([2,4,6,8,10])
>>>data3 = np.array([1,2,3,4,5])
>>>data4 = np.array([6,7,8,9,10])
>>>plt.stackplot(data1,data2,data3,data4,colors=['b','r','m','k'])
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

4.5 餅圖
- 用
plt.pie()函數(shù)繪制堆疊圖。 -
explode表示哪些切片需要拉出。 -
autopct表示顯示百分比的方式。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>data = np.random.random_integers(100,size=(5))
>>>title=["A","B","C","D","E"]
>>>colours = ['b','r','m','k','c']
>>>plt.pie(data,labels=title,colors=colours,startangle=90,shadow=True,autopct='%1.1f%%',explode=(0.1,0,0,0,0))
>>>plt.legend()
>>>plt.show()

5. 時間戳的使用
- 使用
matplotlib.dates模塊將時間戳轉(zhuǎn)換為matplotlib格式。
>>>from datetime import datetime,date,timedelta
>>>import time
>>>import matplotlib.dates as mdates
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>data = np.arange(0,7)
>>>ts_start = datetime(2018,3,30,0,0,0)
>>>ts_now = datetime(2019,3,30,0,0,0)
>>>formatter = mdates.DateFormatter("%Y-%m-%d")
>>>delta = timedelta(5*10^10)
>>>dates = mdates.drange(ts_start,ts_now,delta)
>>>fig,ax = plt.subplots()
>>>plt.plot_date(dates,data)
>>>ax.xaxis.set_major_formatter(formatter)
>>>ax.xaxis.set_tick_params(rotation=30,labelsize=10)
>>>plt.show()

6. 顏色和樣式
6.1 改變標簽顏色
- 使用axis.label.set_color(color)
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>fig,ax = plt.subplots()
>>>plt.plot(x,y,":",label="label sample")
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>ax.xaxis.label.set_color('b') # 改變x軸label顏色
>>>ax.yaxis.label.set_color('c') # 改變y軸label顏色
>>>plt.title('sample title')
>>>plt.legend()
>>>plt.show()

6.2 填充顏色
- 使用
axis.fill_between(x,y1,y2,where=None,interpolate=False, step=None, *, data=None, **kwargs)填充顏色
| 參數(shù) | 含義 |
|---|---|
| x | 表示覆蓋的區(qū)域 |
| y1 | 表示覆蓋的下限 |
| y2 | 表示覆蓋的上限 |
| where | 制定覆蓋區(qū)域,默認為None |
| interpolate | 是否有重疊區(qū)域 |
| step | 步長 |
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":")
>>>fig,ax = plt.subplots()
>>>ax.fill_between(x,0,y,facecolor='b',alpha=0.5)
>>>plt.show()

6.3 自定義邊框
- 可以使用
axis.spines[position]獲得邊框,position可以是left,right,top,bottom。 - 通過
axis.spines.set_color(color)改變邊框顏色。 - 通過
axis.spines.set_visible(bool)設置是否隱藏邊框。 - 通過
axis.spines.set_linewidth(n)設置邊框?qū)挾取?/li>
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>fig,ax = plt.subplots()
>>>ax.spines['top'].set_color('b') # 改變頂部邊框的顏色
>>>ax.spines['bottom'].set_visible(False) # 隱藏底部邊框
>>>ax.spines['left'].set_linewidth(10) # 改變左側(cè)邊框?qū)挾?

6.4 自定義刻度
- 可以使用
axis.tick_params(axis, colors)自定義刻度顏色。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>fig,ax = plt.subplots()
>>>ax.tick_params(axis='x', colors='b')
>>>ax.tick_params(axis='y',colors='r')

6.5 添加水平線和垂直線
- 通過
plt.axhline(y, color, linestyle, linewidth)添加水平線。 - 通過
plt.axvline(y, color, linestyle, linewidth)添加垂直線。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
[圖片上傳中...(下載.png-df23ca-1585644395419-0)]
>>>fig,ax = plt.subplots()
>>>ax.axhline(5, c='b',ls='--', lw=1,)
>>>ax.axvline(5, c='r',ls='-', lw=1,)

6.6 風格美化
- 使用
plt.style.use(style)使用指定的風格。 - 使用
plt.style.available查看所有可以使用的風格。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.style.use('dark_background')
>>>plt.plot(x,y,label="label sample")
>>>plt.show()

7.文本注解
7.1 簡單的文本注解
- 使用
text(x, y, s, fontdict=None, **kwargs)添加注解。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.style.use('ggplot')
>>>plt.text(5,7,'text sample',color='b')
>>>plt.plot(x,y,label="label sample")
>>>plt.show()

7.2 帶箭頭的文本注解
- 使用
annotate(s, xy, *args, **kwargs)添加帶箭頭的文本注解。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.style.use('ggplot')
>>>plt.annotate('text sample',(5,7),
>>> xytext=(0.6, 0.7), textcoords='axes fraction',
>>> arrowprops = dict(facecolor='red',color='red'),
>>> color='b')
>>>plt.plot(x,y,label="label sample")
>>>plt.show()

7.3 使用框+文本的注解
- 可以通過bbox參數(shù)對注解添加邊框。
- bbox接受一個dict,包含以下參數(shù):
| 參數(shù) | 含義 |
|---|---|
| boxstyle | 邊框的類型 |
| fc | 背景顏色 |
| ec | 邊框線的透明度 |
| alpha | 字體的透明度 |
| lw | 線的粗細 |
| rotation | 角度 |
- boxstyle參數(shù)包含的類型:
| 類 | 名稱 | 基礎屬性 |
|---|---|---|
| Circle | circle | pad=0.3 |
| DArrow | darrow | pad=0.3 |
| LArrow | larrow | pad=0.3 |
| RArrow | rarrow | pad=0.3 |
| Round | round | pad=0.3,rounding_size=None |
| Round4 | round4 | pad=0.3,rounding_size=None |
| Roundtooth | roundtooth | pad=0.3,tooth_size=None |
| Sawtooth | sawtooth | pad=0.3,tooth_size=None |
| Square | square | pad=0.3 |
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>bbox = dict(boxstyle="larrow",fc='w',ec="r",lw=1)
>>>t = plt.text(7,6,"sample",ha="center",va="center",size=10,bbox=bbox)
>>>plt.plot(x,y,label="label sample")
>>>plt.show()

8. 多圖表
8.1 子圖
- 使用
plt.subplot(m,n,p)添加子圖,實現(xiàn)在一張圖表里放多個圖表。 - m和n分表代表行和列。
- p代表圖標的編號。
- 子圖的順序是從左到右,從上到下。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>#子圖1
>>>plt.subplot(2,2,1)
>>>plt.plot(x,y,label="sample1",c='b')
>>>plt.legend()
>>>#子圖2
>>>plt.subplot(2,2,2)
>>>plt.plot(x,y,label="sample2",c='r')
>>>plt.legend()
>>>#子圖3
>>>plt.subplot(2,2,3)
>>>plt.plot(x,y,label="sample3",c='m')
>>>plt.legend()
>>>#子圖4
>>>plt.subplot(2,2,4)
>>>plt.plot(x,y,label="sample4",c='y')
>>>plt.legend()
>>>plt.show()

8.2 跨越網(wǎng)格的子圖
- 使用
plt.subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)可以實現(xiàn)在一張圖表里放多個跨越網(wǎng)格的圖表。 - shape表示大圖表的形狀。
- loc表示子圖的位置。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>#子圖1
>>>plt.subplot2grid((4,4),(0,0),colspan=2)
>>>plt.plot(x,y,label="sample1",c='b')
>>>plt.legend()
>>>#子圖2
>>>plt.subplot2grid((4,4),(0,3),rowspan=2)
>>>plt.plot(x,y,label="sample2",c='r')
>>>plt.legend()
>>>#子圖3
>>>plt.subplot2grid((4,4),(2,1),rowspan=2,colspan=2)
>>>plt.plot(x,y,label="sample3",c='m')
>>>plt.legend()
>>>plt.show()

8.3 共享X軸
- 通過設置屬性
sharex參數(shù)實現(xiàn)共享x軸。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>x1 = np.array(range(1,20))
>>>y1 = np.array(range(20,1,-1))
>>>x2 = np.array(range(1,30))
>>>y2 = np.array(range(30,1,-1))
>>>plt.subplots_adjust(wspace =0, hspace =0)#調(diào)整子圖間距
>>>#子圖1
>>>ax=plt.subplot2grid((3,1),(0,0))
>>>ax.get_xaxis().set_visible(False) # 隱藏x軸
>>>ax.spines['bottom'].set_visible(False) # 隱藏下邊框
>>>plt.plot(x,y,label="sample1",c='b')
>>>plt.legend()
>>>#子圖2
>>>ax1=plt.subplot2grid((3,1),(1,0),sharex=ax)
>>>ax1.get_xaxis().set_visible(False)# 隱藏x軸
>>>ax1.spines['bottom'].set_visible(False) # 隱藏下邊框
>>>ax1.spines['top'].set_visible(False) # 隱藏上邊框
>>>plt.plot(x1,y1,label="sample2",c='r')
>>>plt.legend()
>>>#子圖3
>>>ax2=plt.subplot2grid((3,1),(2,0),sharex=ax)
>>>ax2.spines['top'].set_visible(False) # 隱藏上邊框
>>>plt.plot(x2,y2,label="sample3",c='m')
>>>plt.legend()
>>>plt.show()

8.4 共享y軸
- 通過設置屬性
sharey參數(shù)實現(xiàn)共享x軸。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>x1 = np.array(range(1,20))
>>>y1 = np.array(range(20,1,-1))
>>>x2 = np.array(range(1,30))
>>>y2 = np.array(range(30,1,-1))
>>>plt.subplots_adjust(wspace =0, hspace =0)#調(diào)整子圖間距
>>>#子圖1
>>>ax=plt.subplot2grid((1,3),(0,0))
>>>plt.plot(x,y,label="sample1",c='b')
>>>plt.legend()
>>>#子圖2
>>>ax1=plt.subplot2grid((1,3),(0,1),sharey=ax)
>>>ax1.get_yaxis().set_visible(False)# 隱藏x軸
>>>ax1.spines['left'].set_visible(False) # 隱藏左邊框
>>>plt.plot(x1,y1,label="sample2",c='r')
>>>plt.legend()
>>>#子圖3
>>>ax2=plt.subplot2grid((1,3),(0,2),sharey=ax)
>>>ax2.get_yaxis().set_visible(False) # 隱藏x軸
>>>ax2.spines['left'].set_visible(False) # 隱藏左邊框
>>>plt.plot(x2,y2,label="sample3",c='m')
>>>plt.legend()
>>>plt.show()

9. 自定義圖標
9.1 自定義圖標基礎屬性
- 可以通過修改
plt.legend()函數(shù)的參數(shù)自定義圖標,以下列出部分常用屬性:
| 參數(shù) | 含義 | 值 |
|---|---|---|
| loc | 自定義位置 | string/int |
| nco | 自定義列數(shù) | int |
| fontsize | 自定義字體大小 | string/int |
| frameon | 邊框 | bool |
| facecolor | 背景顏色 | string |
| edgecolor | 邊框顏色 | string |
| title | 標題 | string |
| prop | 屬性 | dict |
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>for i in range(1,4):
>>> plt.plot(x+i,y+i,label="label sample{}".format(i))
>>>leg = plt.legend(loc='upper center',ncol=2,title='sample',facecolor='b',prop={'size':12})
>>>leg.get_frame().set_alpha(0.4) # 改變透明度
>>>plt.show()

9.1 更精準的定位
- 可以通過
plt.legend()的bbox_to_anchor=(x, y, width, height)參數(shù)實現(xiàn)精準定位。 - `bbox_to_anchor'可以將圖標定位到圖例外。
- `bbox_to_anchor'參數(shù)接受一個元祖,分別代表圖標的坐標、寬和高。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>for i in range(1,4):
>>> plt.plot(x+i,y+i,label="label sample{}".format(i))
>>>leg = plt.legend(title='sample',bbox_to_anchor=(1.5,1))
>>>plt.show()

10. 3D 繪圖
-
mpl_toolkits包是matplotlib提供的三維繪制包,可以使用basemap中的Axes3D模塊實現(xiàn)3D繪圖。
10.1 實現(xiàn)簡單的3D繪圖
- 基本用法與2D類似,但是需要通過
Axes3D()函數(shù)將figure轉(zhuǎn)為3D對象。 - 使用
plot_wireframe()函數(shù)繪制線框圖。
>>>from mpl_toolkits.mplot3d import Axes3D
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>z = np.array([np.sin(x)])
>>>fig = plt.figure()
>>>ax = Axes3D(fig)
>>>ax.plot_wireframe(x,y,z)
>>>ax.set_xlabel('sample x')
>>>ax.set_ylabel('sample y')
>>>ax.set_zlabel('sample z')
>>>plt.show()

10.2 3D散點圖
- 與2D一樣,使用plt.scatter繪制散點圖,只是多了一個維度。
>>>from mpl_toolkits.mplot3d import Axes3D
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>z = np.array([np.sin(x)])
>>>fig = plt.figure()
>>>ax = Axes3D(fig)
>>>ax.scatter(x,y,z,c='b',marker='o')
>>>ax.set_xlabel('sample x')
>>>ax.set_ylabel('sample y')
>>>ax.set_zlabel('sample z')
>>>plt.show()

10.3 3D條形圖
- 由于要考慮到條的深度,所以3D條形圖的維度會比3D更復雜。
- 可以使用`plt.bar3d(x,y,z,dx,dy,dz)'繪制3D條形圖。
>>>from mpl_toolkits.mplot3d import Axes3D
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>z = np.array(np.cos(x))
>>>dx=dy= np.ones(9)
>>>dz= np.array(range(1,10))
>>>fig = plt.figure()
>>>ax = Axes3D(fig)
>>>ax.bar3d(x,y,z,dx,dy,dz)
>>>ax.set_xlabel('sample x')
>>>ax.set_ylabel('sample y')
>>>ax.set_zlabel('sample z')
>>>plt.show()

參考資料
- numpy包的應用 作者:你們都厲害
- 理解numpy的rollaxis與swapaxes函數(shù) 作者:liaoyuecai
- Python機器學習及分析工具:Scipy篇 作者:殉道者之花火
- 奇客谷 作者: 吳吃辣
- 統(tǒng)計stats模塊 作者: 火鍋俠