1. 程式人生 > >Python資料處理 | (三) Matplotlib資料視覺化

Python資料處理 | (三) Matplotlib資料視覺化

本篇部落格所有示例使用Jupyter NoteBook演示。

Python資料處理系列筆記基於:Python資料科學手冊電子版  下載密碼:ovnh

示例程式碼  下載密碼:02f4

 

目錄

一、Matplotlib常用技巧

1.匯入Matplotlib

2.設定繪圖樣式

3.用不用show()?如何顯示圖形

4.將圖形儲存為檔案

二、兩種畫圖介面

1.MATLAB風格介面

2.面向物件介面

三、簡易折線圖

1.調整圖形:線條的顏色與風格

2.調整圖形:座標軸上下限

3.設定圖形標籤

四、簡易散點圖

1.用plt.plot畫散點圖

2.用plt.scatter畫散點圖

3.plot與scatter:效率對比

五、視覺化異常處理

1.基本誤差線

2.連續誤差

六、密度圖和等高線圖

1.三維函式的視覺化

七、頻次直方圖、資料區間劃分和分佈密度

1.二維頻次直方圖與資料區間劃分

八、配置圖例

1.選擇圖例顯示的元素

2.在圖例中顯示不同尺寸的點

3.同時顯示多個圖例

九、配置顏色條

1.配置顏色條

2.案例:手寫數字

十、多子圖

1.plt.axes:手動建立子圖

2.plt.subplot:簡易網格子圖

3.plt.subplots:一行程式碼建立網格

4.plt.GridSpec:實現更復雜的排列方式

十一、文字與註釋

1.案例:節假日對美國出生率的影響

2.座標變換與文字位置

3.箭頭與註釋

十二、自定義座標軸刻度

1.主要刻度與次要刻度

2.隱藏刻度與標籤

3.增減刻度數量

4.花哨的刻度格式

5.格式生成器與定位器小結

十三、Matplotlib自定義:配置檔案與樣式表

1.手動配置圖形

2.修改預設配置:rcParams

3.樣式表

十四、用Matplotlib畫三維圖

1.三維資料點與線

2.三維等高線圖

3.線框圖和曲面圖

4.曲面三角剖分

十五、用Basemap視覺化地理資料

1.地圖投影

2.畫一個地圖背景

3.在地圖上畫資料

4.案例:美國加州城市資料

5.案例:地表溫度資料

十六、用Seaborn做資料視覺化

1.Seaborn與Matplotlib

2.Seaborn圖形介紹

3.案例:探索馬拉松比賽成績資料


一、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.增減刻度數量

預設刻度值,顯示小圖片時會十分擁擠: