Python資料處理 | (三) Matplotlib資料視覺化
本篇部落格所有示例使用Jupyter NoteBook演示。
Python資料處理系列筆記基於:Python資料科學手冊電子版 下載密碼:ovnh
示例程式碼 下載密碼:02f4
目錄
一、Matplotlib常用技巧
1.匯入Matplotlib
2.設定繪圖樣式
3.用不用show()?如何顯示圖形
- 在指令碼中畫圖
如果在指令碼檔案或整合環境中使用Matplotlib,顯示圖形必須使用plt.show():
注意一個Python會話只能使用一次plt.show(),通常放在指令碼最後;多個plt.show()會導致異常。
- 在Ipython shell中畫圖
在Ipython shell中啟動Matplotlib模式後,就不需要使用plt.show().
此後任何plt命令都會自動開啟一個圖形視窗,增加新命令,圖形就會更新。
有一些變化,如改變已經畫好的線條屬性不會自動及時更新,可以使用plt.draw()強制更新。
-
在Ipython Notebook中畫圖
將圖形直接嵌在IPython Notebook頁面中,有兩種形式上:
1)%matplotlib notebook會在Notebook中啟動互動式圖形
2)%matplotlib inline會在Notebook中啟動靜態圖形
統一使用2):
4.將圖形儲存為檔案
可以用savefig()把圖形儲存為不同的資料格式:
檢視系統支援的檔案格式:
儲存影象檔案不需要使用plt.show()等命令。
二、兩種畫圖介面
1.MATLAB風格介面
這種介面是有狀態的:會持續跟蹤當前的圖形和座標軸,所有plt命令都可以用:
這種介面當建立第二個子圖時,如果再回到第一個子圖增加內容,會很複雜。
2.面向物件介面
畫簡單圖形時,二者看個人喜好;畫比較複雜的圖形時,面向物件方法會更方便。
三、簡易折線圖
在Notebook中畫圖,需要先匯入:
首先需要建立一個圖形fig和一個座標軸ax:
然後用ax.plot畫圖(面向物件介面):
plt.plot() Matplotlib介面:
在一幅圖中畫多條曲線,可以重複呼叫plot:
1.調整圖形:線條的顏色與風格
設定曲線顏色,用color引數,有多種表示方法:
如果不知道顏色,會為多條曲線預設使用一組顏色。
可以用linestyle引數調整線條風格:
組合color和linestyle引數:
2.調整圖形:座標軸上下限
也可以使用plt.axis()設定範圍:
plt.axis()還可以設定佈局:
3.設定圖形標籤
設定圖形標題和座標標題:
單圖顯示多條曲線時,設定圖例:
絕大多數Matlab介面和麵向物件介面是通用的,如plt.plot()和ax.plot(),plt.legend()和ax.legend()等,也有一些稍有不同,二者轉換如下:
使用面向物件介面時,一般不單獨呼叫這些函式,而是用ax.set()統一設定:
四、簡易散點圖
1.用plt.plot畫散點圖
演示一些不同的圖形標記:
圖形標記可以與線條和顏色結合使用:
設定散點和線條的屬性:
2.用plt.scatter畫散點圖
與plt.plot()相比,plt.scatter()建立散點圖更靈活:
引入鳶尾花資料集,feature[0]是花萼長度,feature[1]是花萼寬度,圖中點的大小代表feature[3]花瓣的寬度,三種顏色對應三種類型的鳶尾花:
3.plot與scatter:效率對比
對於小型資料集,二者差異不大;對於大型資料集,plot比scatter快很多。
原因在於plot中散點基本彼此複製,整個資料集中所有點的顏色、尺寸只需要配置一次;scatter會對每個散點進行單獨的大小與顏色的渲染。
五、視覺化異常處理
1.基本誤差線
改善選項,一般誤差線顏色比資料點顏色淺一點比較好:
可以設定水平誤差線、單側誤差線等。可以參考程式文件plt.errorbar.
2.連續誤差
有時需要顯示連續變數的誤差:
通過高斯過程迴歸方法,演示對帶有不確定性的連續測量值進行擬合:
fill_between首先傳入x軸座標值,然後傳入y軸下邊界,以及上邊界,接下來是一些線條屬性設定。,整個區域被誤差線填充。
擬合效果:在接近樣本點的區域,模型受很強的約束,擬合誤差很小,接近真實值;遠離樣本點的區域,模型不受約束,誤差不斷增大。
六、密度圖和等高線圖
1.三維函式的視覺化
等高線圖視覺化三維資料:
檢視所有配色方案:
可以用plt.contourf()來填充等高線,語法和plt.contour()一致:
通過plt.imshow(),將2維陣列渲染成漸變圖:
imshow()注意事項:
1)plt.imshow()不支援x軸和y軸資料設定網格,必須通過extent引數設定圖形的座標範圍[xmin,xmax,ymin,ymax
2) plt.imshow()原點在左上角,而不是絕大多數等高線圖使用的左下角。在顯示網格資料圖形時必須調整
3)plt.imshow()會自動調整座標軸的精度以適應資料顯示。可以通過plt.axis(aspect='image')設定x和y軸的單位
將等高線圖與彩色圖結合:如將一幅背景為半透明的彩色圖(alpha設定透明度),與另一幅座標相同、帶資料標籤的等高線圖疊放在一起(plt.clabel()):
七、頻次直方圖、資料區間劃分和分佈密度
一個簡易的頻次直方圖:
個性化的頻次直方圖:
同坐標軸多個頻次直方圖:
簡單計算每個區間內的樣本數,不想畫圖:
1.二維頻次直方圖與資料區間劃分
就像把一維陣列分為區間建立一維頻次直方圖一樣,可以將2維陣列按照2維區間劃分,建立2維頻次直方圖:
- plt.hist2d:2維頻次直方圖
與hist一樣hist2d也有很多其他配置選項。
如果不想畫圖,只想檢視計算結果:
- plt.hexbin:六邊形區間劃分
2維頻次直方圖是與座標軸正交的方塊分割而成的,比較常用的是用正六邊形分割:
-
核密度估計
用於評估多維資料分佈密度的常用方法,KDE。
演示用KDE抹去空間中離散的資料點,擬合出一個平滑的函式:
八、配置圖例
可以使用plt.legend()/ax.legend()來建立最簡單的圖例,它會自動建立一個包含每個圖形元素的圖例:
個性化圖例設定:
1.選擇圖例顯示的元素
圖例會預設顯示所有元素的標籤,也可以不顯示全部:
也可以為要顯示的圖例設定標籤:
2.在圖例中顯示不同尺寸的點
有時可能需要用不同尺寸的點表示資料特徵,希望建立這樣的圖例來反應這些特徵。
下面有點的尺寸來表示美國加州不同城市的面積,顏色代表不同城市的人口數,通過一個不同尺寸的點來顯示不同面積的圖例:
加州城市資料集 下載密碼:94pq
3.同時顯示多個圖例
如果要在一張圖上顯示多個圖例不太容易,legend()只能為一張圖設定第一個圖例,再設定圖例第一個會被覆蓋。
可以通過如下方法實現:
九、配置顏色條
建立最簡單的顏色條:
1.配置顏色條
通過cmap引數設定顏色條配色方案:
檢視所有配色方案:
- 選擇配色方案
一般情況下只需重點關注三種不同的配色方案:
1)順序配色方案:由一組連續的顏色構成的配色方案(binary或viridis)
2)互逆配色方案:由兩種互補的顏色構成,表示正反兩種含義(RdBu或PuOr)
3)定性配色方案:隨機順序的一組顏色(rainbow或jet)
可以通過把配色方案轉換成黑白的灰度圖看看具體的顏色:
上圖中灰度圖中比較亮的條紋。這些亮度變化不均勻的條紋在彩色圖中對應一段區間,由於色彩太接近容易凸顯出資料集中不重要的部分,jet不是一種好的配色方案,更好的是viridis。
彩虹效果,可以用cubehelix配色方案視覺化連續的數值:
要用兩種顏色表示正反兩種含義時,可使用RdBu雙色配色方案:
- 顏色條刻度的限制與擴充套件功能的設定
顏色條本身可以看作一個plt.Axes的例項,之前學習的關於座標軸和刻度紙的格式配置都可以用。
我們還可以縮短顏色取值的上下限,對於超出上下限的資料,通過extend用三角箭頭表示比上限大的數或比下限小的數。
左圖用預設的顏色條刻度限制實現的效果,噪點的範圍完全覆蓋了我們感興趣的資料。
右圖設定了顏色條刻度的上下限,並在上下限之外增加了擴充套件功能,這樣資料視覺化圖形顯然更有效果。
- 離散型顏色條
顏色條預設是連續的,有時可能需要表示離散資料:
2.案例:手寫數字
下載手寫數字資料集,對一些數字視覺化:
每個數字由64個畫素構成,每個數字可以看作一個64維空間中的點,每個維度表示一個畫素的亮度。
視覺化高維空間非常困難,一種解決方法是降維,在儘量保留資料內部重要關聯性的同時降低資料的維度,如流形學習:
使用流形學習將數字投影到2維空間並可視化:
數字3和5投影面積有重疊,說明手寫3,5難以區分,自動分類演算法容易搞混;
其他數字如0和1,隔得比較遠,說明2者不太可能出現混淆。
十、多子圖
1.plt.axes:手動建立子圖
plt.axes預設建立一個標準座標軸,圖形座標系統由四個值組成[底座標,左座標,寬度,高度],取值範圍為左下角為原點(0),右上角為1.
建立兩個豎直排列的座標軸:
上子圖起點座標y為0.5位置,與下子圖對應,起點y座標為0.1位置,高度為0.4
2.plt.subplot:簡易網格子圖
建立彼此對齊的行列子圖:
面向物件介面可實現同樣的效果:
3.plt.subplots:一行程式碼建立網格
4.plt.GridSpec:實現更復雜的排列方式
實現不規則的多行多列子圖網格:
建立多軸頻次直方圖(後續的Seaborn中會有專門的介面):
十一、文字與註釋
基本的註釋可能只是座標軸標題與圖示題,但註釋遠遠不止這些。
1.案例:節假日對美國出生率的影響
美國出生人口資料 下載密碼:iwwn
如果為圖形新增一些註釋,就更能吸引讀者注意了。plt.text()/ax.plot()可以在圖中某個座標點上手動添加註釋:
2.座標變換與文字位置
三種座標變換方式:
1)ax.transData 以資料為基準的座標變換,預設值,以x,y軸的標籤作為資料座標
2)ax.transAxes以座標軸為基準的座標變換,以下圖中白色矩形左下角為原點,按座標軸尺寸的比例顯示座標
3)fig.transFigure以圖形為基準的座標變換,以下圖中灰色矩形左下角為原點,按圖形尺寸的比例顯示座標
3.箭頭與註釋
arrowprop字典設定箭頭風格,更多選項可以檢視官方文件。
用之前的人口資料演示一些箭頭註釋:
十二、自定義座標軸刻度
Matplotlib目標是用Python物件表現任意圖形元素,例如每個figure物件都會包含一個或多個axes物件,每個axes物件又會包含其他表示圖形內容的物件。
對於座標軸刻度線,每個axes都有xaxis和yaxis屬性,每個屬性同包含構成座標軸的線條、刻度和標籤的全部屬性。
1.主要刻度與次要刻度
主要刻度更顯著且有標籤,次要刻度更小且沒有標籤。一般情況下Matplotlib不使用次要刻度,可以在對數圖中看到:
可以設定每個座標軸的formatter和locator物件,自定義刻度線位置和標籤。
檢視x軸屬性:
上圖的主要刻度和次要刻度的位置都是由LogLocator物件設定。
上圖的主要刻度的標籤由LogFormatterMathtext物件設定;主要刻度的標籤由NullFormatter物件設定,所以不顯示。
2.隱藏刻度與標籤
上例中隱藏了x軸標籤,但刻度/網格線會保留;隱藏了y軸刻度,此時y軸標籤也一併隱藏。
很多時候顯示圖片時是不需要刻度的,如顯示人臉圖片:
3.增減刻度數量
預設刻度值,顯示小圖片時會十分擁擠: