1. 程式人生 > >【資料科學】Python資料視覺化概述

【資料科學】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風格的畫圖介面直觀易用,但是遇到一些精細操作時,就會比較麻煩。面向物件的畫圖介面可以適應更復雜的場景,更精細的控制需要展示的圖形。

在面向物件介面中,畫圖函式不再受到當前"活動"圖形或座標軸的限制,而變成了顯式的FigureAxes的方法。在畫圖的過程中,實際操作的是這兩個類的例項:figure和axes.

figureplt.Figure類的一個例項)可以被看成是一個能夠容納各種座標軸、圖形、文字和標籤的容器。axesplt.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()返回figax例項,也可以直接使用plt.Figureplt.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函式影象

當我們獲取figax例項後,就可以直接操作這兩個例項來完成想要視覺化效果。操作這兩個例項的方法眾多,可參考下面的官方文件:

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