【資料科學】Python資料視覺化概述
注:很早之前就打算專門寫一篇與Python資料視覺化相關的部落格,對一些基本概念和常用技巧做一個小結。今天終於有時間來完成這個計劃了!
0. Python中常用的視覺化工具
Python在資料科學中的地位,不僅僅是因為numpy, scipy, pandas, scikit-learn這些高效易用、介面統一的科學計算包,其強大的資料視覺化工具也是重要組成部分。在Python中,使用的最多的資料視覺化工具是matplotlib,除此之外還有很多其他可選的視覺化工具包,主要包括以下幾大類:
- matplotlib以及基於matplotlib開發的工具包:pandas中的封裝matplotlib API的畫圖功能,seaborn,networkx等;
- 基於JavaScript和d3.js開發的視覺化工具:plotly等,這類工具可以顯示動態圖且具有一定的互動性;
- 其他提供了Python呼叫介面的視覺化工具:OpenGL, GraphViz等,這一類工具各有特點且在特定領域應用廣泛.
對於資料科學,用的比較多的是matplotlib和seaborn,對資料進行動態或互動式展示時會用到plotly.
1. matplotlib與MATLAB
Matplotlib是建立在NumPy陣列基礎上的多平臺資料視覺化程式庫,John Hunter在2002年提出了matplotlib的初步構想——在Python中畫出類似MATLAB風格的互動式圖形。鑑於此種淵源,類似MATLAB風格的畫圖介面是matplotlib的兩種畫圖介面之一。這類介面直觀、便捷,許多語法與MATLAB類似,也是初學者常用的方式。
這種介面最重要的特性是有狀態的(stateful):它會持續跟蹤"當前的"圖形和座標軸,所有plt命令都可以應用。可以用plt.gcf()(獲取當前圖形)和plt.gca()(獲取當前座標軸)來檢視具體資訊。
matplotlib畫圖的基本設定:
1 import matplotlib as mpl 2 import matplotlib.pyplot as plt 3 mpl.rcParams['axes.linewidth'] = 1.5 #set the value globally, 設定座標軸線寬 4 import seaborn as sns 5 sns.set() #使用seaborn設定繪圖風格
下面使用MATLAB風格畫圖,對一組分類變數(categorical variables)進行視覺化
1 names = ['group_a', 'group_b', 'group_c'] # 不同分類的名稱 2 values = [1, 10, 100] # 不同分類對應的值 3 4 plt.figure(1, figsize=(9, 3)) # 設定圖片大小 5 6 plt.subplot(131) # 1x3, 第一個子圖 7 plt.bar(names, values) # 柱狀圖 8 plt.subplot(132) # 1x3, 第二個子圖 9 plt.scatter(names, values) # 散點圖 10 plt.subplot(133) # 1x3, 第三個子圖 11 plt.plot(names, values) # 折線圖 12 plt.suptitle('Categorical Plotting') # 圖片的標題 13 # w_pad設定子圖之間的間隔寬度;rect設定整個影象部分(矩形)的左上點座標和右下點座標,預設值為[0, 0, 1, 1] 14 plt.tight_layout(w_pad=0.1, rect=[0, 0.03, 1, 0.95]) 15 plt.savefig('demo1.png', dpi=200) # 儲存圖片
圖片如下:
圖1:分類變數的視覺化
這種方式畫圖非常直觀,每一步都對"plt"物件有一個特定的操作,畫圖的過程至上而下,畫好之後儲存圖片。其他命令說明如下:
- subplot(131)表示設定子圖為1行3列,且當前為第1個子圖;
- 在儲存圖片之前呼叫tight_layout()函式可以使圖片更加緊湊,邊框更窄,更多關於該函式的用法可參考官方文件;
- 儲存圖片是可以使用引數dpi設定圖片的解析度.
在官方文件中,這種風格的API被稱為"pyplot API".
2. matplotlib的第二種風格——面向物件的畫圖介面
在面向物件程式設計中有一句口號:"一切皆物件",Python既然是一種面向物件的程式語言,畫圖也自然可以使用面向物件的方式。MATLAB風格的畫圖介面直觀易用,但是遇到一些精細操作時,就會比較麻煩。面向物件的畫圖介面可以適應更復雜的場景,更精細的控制需要展示的圖形。
在面向物件介面中,畫圖函式不再受到當前"活動"圖形或座標軸的限制,而變成了顯式的Figure和Axes的方法。在畫圖的過程中,實際操作的是這兩個類的例項:figure和axes.
figure(plt.Figure類的一個例項)可以被看成是一個能夠容納各種座標軸、圖形、文字和標籤的容器。axes(plt.Axes類的一個例項)是一個帶有刻度和標籤的矩形,最終會包含所有視覺化的圖形元素。通常使用變數fig表示一個圖形例項,用變數ax表示一個座標軸例項或一組座標軸例項。
下面是一個使用面向物件的API畫圖的例子:
1 import numpy as np 2 import matplotlib.pyplot as plt 3 %matplotlib inline 4 5 # example data 6 x = np.arange(0.1, 4, 0.5) 7 y = np.exp(-x) 8 9 #設定error bar的(單側)長度 10 error = 0.1 + 0.2 * x 11 12 # 使用subplots返回fig和ax例項 13 fig, (ax0, ax1) = plt.subplots(nrows=2, sharex=True, figsize=(8, 6)) # 兩個子圖,返回兩個Axes例項 14 15 # 第一個子圖,對稱的error bar 16 ax0.errorbar(x, y, yerr=error, fmt='-o') 17 ax0.set_title('variable, symmetric error') 18 19 # 分別設定error bar兩側的長度 20 lower_error = 0.4 * error 21 upper_error = error 22 asymmetric_error = [lower_error, upper_error] 23 24 # 第二個子圖,不對稱的error 25 ax1.errorbar(x, y, xerr=asymmetric_error, fmt='o') 26 ax1.set_title('variable, asymmetric error') 27 ax1.set_yscale('log') 28 fig.tight_layout() 29 fig.savefig('demo2.png', dpi=200) # 儲存圖片
結果如下:
圖2:error bar的視覺化
如上面的例子顯示的那樣,可以使用函式plt.subplots()返回fig和ax例項,也可以直接使用plt.Figure和plt.Axes這兩個類來返回各自的例項:
1 import numpy as np 2 import matplotlib.pyplot as plt 3 plt.style.use('seaborn-whitegrid') 4 %matplotlib inline 5 6 fig = plt.figure(figsize=(8, 6)) 7 ax = plt.axes() 8 x = np.linspace(0, 10, 100) 9 ax.plot(x, np.sin(x)) 10 ax.set_xlabel('x', size=14) 11 ax.set_ylabel('sin x', size=14) 12 ax.set_title('sin plot', size=16) 13 fig.tight_layout() 14 fig.savefig('demo3.png', dpi=200)
結果如下:
圖3:sin函式影象
當我們獲取fig和ax例項後,就可以直接操作這兩個例項來完成想要視覺化效果。操作這兩個例項的方法眾多,可參考下面的官方文件:
3. 統計作圖以及圖片的風格
除了matplotlib之外,seaborn是專門為統計製圖開發的視覺化工具。除了直接用於資料的視覺化之外,還能夠完成一些常見的統計功能來輔助畫圖,例如誤差線的估計,密度估計,箱形圖分位數的計算等。此外,與matplotlib相比,seborn畫圖的風格更美觀。因此該視覺化工具在資料分析中也用的比較多。
按照文件中對API的介紹,seaborn主要將統計製圖分為下面幾類:
- 關係圖
- 分類圖
- 分佈圖
- 迴歸圖
- 矩陣圖:heatmap或聚類圖
上面例子中涉及到兩次對畫圖風格的設定,風格主要包括對圖的配色,背景色、座標軸、字型、透明度等的設定。在matplotlib中主要有以下風格可選:
> print(plt.style.available) #---output---# ['dark_background', 'seaborn-notebook', 'seaborn-darkgrid', '_classic_test', 'ggplot', 'seaborn-bright', 'classic', 'Solarize_Light2', 'fast', 'fivethirtyeight', 'seaborn-dark-palette', 'seaborn', 'tableau-colorblind10', 'seaborn-muted', 'seaborn-whitegrid', 'seaborn-ticks', 'seaborn-dark', 'seaborn-white', 'grayscale', 'seaborn-deep', 'seaborn-poster', 'seaborn-talk', 'seaborn-colorblind', 'bmh', 'seaborn-pastel', 'seaborn-paper']
參考上面的Customizing matplotlib連結,各種不同樣式的比較可以參考:Matplotlib Style Gallery
4. 常見的作圖型別及功能
matplotlib可以畫大部分常見的圖,例如柱狀圖、折線圖、餅圖、直方圖等。
Reference
https://tonysyu.github.io/raw_content/matplotlib-style-gallery/gallery.html
https://jakevdp.github.io/PythonDataScienceHandbook/
https://seaborn.pydata.org/index.html
https://matplotlib.org/index.html
https://stackoverflow.com/questions/8248467/matplotlib-tight-layout-doesnt-take-into-account-figure-suptitle