機器學習(四):初級matplitlib繪圖-2維繪圖

注:百度百科案例

首先,我們必須導入對應的庫。主要的繪圖函數在子庫 matplotlib.pyplot

import numpy as np
import matplitlib as nml
import matplotlib.pyplot as plt
%matplotlib inline

注:%matplotlib inline是再使用jupyter notebook或者jupyter qtconsole的時候纔會用到,如果用的是pycharm或者spyder即不需要使用這個(用了還會報錯)。在notebook中使用這個的作用是在你調用matplotlib.pyplot的繪圖函數plot()進行繪圖的時候,或者生成一個figure畫布的時候,可以直接在你的python console裏面生成圖像。

我們將按照存儲在 NumPy ndarray 對象中的數據繪製圖表。當然,matplotlib 也能夠按照以不同的 Python格式存儲的數據(如列表對象)繪製圖表。首先,我們需要用於繪製圖表的數據。爲此,我們生成20個標準正態分佈(僞)隨機數,保存在一個NumPy ndarray

np.random.seed(1000)
y = np.random.standard_normal(20)

假定:

x值:包含x座標(橫座標)的列表或者數組

y值:包含y座標(縱座標)的列表或者數組

x和y值的數量必須相等,如下述代碼:

x = range(len(y)) 

plt.plot(x,y) 

plt.show()

顯示如圖:

我們用樣板數據調用 ndarray 對象上的 cumsum 方法,可以獲得這些數據的總和,並且和預想的一樣得到不同的輸出,如下圖

plt.grid(True) #添加網格線
plt.axis('tight') #緊湊座標軸
plt.show()

plt.axis選項:

empty:返回當前座標軸限值

off:關閉當前座標軸線和標籤

equal:使用等刻度

scaled:通過尺寸變化平衡刻度

tight:是所有數據可見(縮小限值)

image:使所有數據可見(使用數據限值)

[xmin,xmax,ymin,ymax]:將設置限定爲給定的一組值

可以使用 plt.xlim 和 plt.ylim 設置每個座標軸的最小值和最大值。爲了得到更好的易理解性,圖表通常包含一些標籤——例如描述x和y值性質的標題和標籤。這些標籤分別通過 plt.titleplt.xlabe和 plt.ylabel 添加。默認情況下,即使提供的數據點是離散的,plot也繪製連續線條。離散點的繪製通過選擇不同的樣式選項實現。下圖覆蓋(紅色)點和線寬爲1.5個點的(藍色)線條:

plt.figure(figsize=(7,4))
plt.plot(y.cumsum(),'b',lw=1.5)
plt.plot(y.cumsum(),'ro')
plt.grid(True) #添加網格線
plt.axis('tight') #緊湊座標軸
plt.xlabel('index')
plt.ylabel('value')
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.title('夢裏是客')
plt.xlim(-1,20) #座標軸刻度的範圍
plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

plt.plot 支持的顏色等可查看如下鏈接:

https://blog.csdn.net/qq_26376175/article/details/67637151

特殊字符,例如公式查看以下鏈接:

https://matplotlib.org/users/mathtext.html

一般來說,數據集包含多個單獨的子集。這種數據的處理遵循matplotlib處理一維數據時的原則。但是,這種情況會出現其他一些問題,例如,兩個數據集可能有不同的刻度,無法用相同的y或x軸刻度繪製。另一個問題是,你可能希望以不同的方式可視化兩組不同數據,例如,一組數據使用線圖,另一組使用柱狀圖。

我們生成一個二維樣本數據集。下面的代碼生成包含標準正態分佈(僞)隨機數的20×2 NumPy ndarray。在這個數組上調用 cumsum 計算樣本數據在0軸(即第一維)上的總和。可以爲每個數據集添加單獨的標籤並在圖例中列出。plt.legend 接受不同的位置參數。0表示“最佳位置”,也就是圖例儘可能少地遮蓋數據。下圖展示了包含兩個數據集的圖表,這一次帶有圖例。在生成代碼中,我們沒有傳遞整個 ndarray 對象,而是分別訪問兩個數據子集(y[:, 0]和y[:, 1]),可以爲它們附加單獨的標籤。數據集常常有不同的刻度,用單一 y軸刻度繪製這種數據的圖表通常會導致可視化信息的顯著丟失。爲了說明這種效果,我們將兩個數據子集中的第一個擴大 100倍,再次繪製該圖

np.random.seed(2000)
y = np.random.standard_normal((20,2)).cumsum(axis=0)
x = range(len(y))
y[:,0]=y[:,0]*100
plt.figure(figsize=(7,4))
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,1],lw=1.5,label='2st')
plt.plot(y,'ro')
plt.grid(True) #添加網格線
plt.axis('tight') #緊湊座標軸
plt.legend(loc=0)#0表示最佳位置,使圖例儘可能少的遮蓋數據
plt.xlabel('index')
plt.ylabel('value')
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.title('夢裏是客')
plt.show()

第一個數據集仍然是“在視覺上易於辨認的”,而第二個數據集在新的Y軸刻度上看起來像一條直線。在某種程度上,第二個數據集的有關信息現在“在視覺上已經丟失”。解決這個問題有兩種基本方法:

1:使用 2 個 y 軸(左/右)

2:使用兩個子圖(上/下,左/右)

我們首先在圖表中引入第二個 y 軸。下圖中有兩個不同的y軸,左側的y軸用於第一個數據集,右側的y軸用於第二個數據集,因此,有兩個圖例:

np.random.seed(2000)
y = np.random.standard_normal((20,2)).cumsum(axis=0)
x = range(len(y))
y[:,0]=y[:,0]*100
fig,ax1 = plt.subplots()
#plt.figure(figsize=(7,4))
plt.plot(y[:,0],'b',lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
plt.grid(True) #添加網格線
plt.legend(loc=8)
plt.xlabel('index')
plt.ylabel('value 1st')
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.title('夢裏是客')
ax2=ax1.twinx()
plt.plot(y[:,1],'g',lw=1.5,label='2st')
plt.plot(y[:,1],'ro')
plt.legend(loc=0)
plt.ylabel('value 2st')
#plt.xlim(-1,20) #座標軸刻度的範圍
#plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

通過使用 plt.subplots函數,可以直接訪問底層繪圖對象(圖、子圖等)。例如,可以用它生成和第一個子圖共享x軸的第二個子圖。上圖中有兩個相互重疊的子圖。

接下來,考慮兩個單獨子圖的情況。這個選項提供了處理兩個數據集的更大自由度,如下圖所示:

plt.figure(figsize=(7,5))
plt.subplot(211)
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
#plt.grid(True) #添加網格線
#plt.axis('tight')
plt.legend(loc=0)
plt.xlabel('index')
plt.ylabel('value')
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.title('夢裏是客')

plt.subplot(212)
plt.plot(y[:,1],'g',lw=1.5,label='2st')
plt.plot(y[:,1],'ro')
plt.legend(loc=0)
plt.xlabel('index')
plt.ylabel('value')
#plt.grid(True) #添加網格線
#plt.axis('tight')
#plt.xlim(-1,20) #座標軸刻度的範圍
#plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

選擇兩個不同的圖表類型來可視化數據可能是必要的或者是理想的。利用子圖方法,就可以自由地組合matplotlib提供的任意圖表類型,下圖組合了線圖/點圖和柱狀圖:

plt.figure(figsize=(9,4))
plt.subplot(211)
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
#plt.grid(True) #添加網格線
#plt.axis('tight')
plt.legend(loc=0)
plt.xlabel('index')
plt.ylabel('value')
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.title('夢裏是客')

plt.subplot(212)
plt.bar(np.arange(len(y)),y[:,1],width=0.5,color='g',label='2st')
plt.grid(True)
plt.axis('tight')
plt.legend(loc=0)
plt.xlabel('index')
plt.ylabel('value')
plt.title('shiyp')
#plt.grid(True) #添加網格線
#plt.axis('tight')
#plt.xlim(-1,20) #座標軸刻度的範圍
#plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章