1. 程式人生 > >【數據科學】Python數據可視化概述

【數據科學】Python數據可視化概述

位數 初步 動態 實例 進行 com 基本設置 classic -o

:很早之前就打算專門寫一篇與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設置繪圖風格

更多自定義設置可以參考官方文檔:Customizing matplotlib

下面使用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".

  • 一個簡短的入門級教程:Pyplot tutorial
  • 更多的介紹可以參考文檔:The pyplot API
  • 更多例子可以參考官方的Gallery

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實例後,就可以直接操作這兩個實例來完成想要可視化效果。操作這兩個實例的方法眾多,可參考下面的官方文檔:

  • 關於該API的描述:The object-oriented API
  • 所有元素的最高等級容器:Figure
  • 坐標軸ax類:The Axes class
  • 一些使用ax實例的例子:Examples using matplotlib.pyplot.axes
  • 創建fig和坐標軸實例的subplots函數:subplots

3. 統計作圖以及圖片的風格


除了matplotlib之外,seaborn是專門為統計制圖開發的可視化工具。除了直接用於數據的可視化之外,還能夠完成一些常見的統計功能來輔助畫圖,例如誤差線的估計,密度估計,箱形圖分位數的計算等。此外,與matplotlib相比,seborn畫圖的風格更美觀。因此該可視化工具在數據分析中也用的比較多。

按照文檔中對API的介紹,seaborn主要將統計制圖分為下面幾類:

  • 關系圖
  • 分類圖
  • 分布圖
  • 回歸圖
  • 矩陣圖:heatmap或聚類圖

使用seaborn畫圖的例子可以參考:Example gallery

上面例子中涉及到兩次對畫圖風格的設置,風格主要包括對圖的配色,背景色、坐標軸、字體、透明度等的設置。在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可以畫大部分常見的圖,例如柱狀圖、折線圖、餅圖、直方圖等。

更多詳情可以參考:Plotting-basic

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

【數據科學】Python數據可視化概述