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

:很早以前就打算專門寫一篇與Python數據可視化相關的博客,對一些基本概念和經常使用技巧作一個小結。今天終於有時間來完成這個計劃了!html

 

0. Python中經常使用的可視化工具


Python在數據科學中的地位,不只僅是由於numpy, scipy, pandas, scikit-learn這些高效易用、接口統一的科學計算包,其強大的數據可視化工具也是重要組成部分。在Python中,使用的最多的數據可視化工具是matplotlib,除此以外還有不少其餘可選的可視化工具包,主要包括如下幾大類:git

  • matplotlib以及基於matplotlib開發的工具包:pandas中的封裝matplotlib API的畫圖功能,seaborn,networkx等;
  • 基於JavaScript和d3.js開發的可視化工具:plotly等,這類工具能夠顯示動態圖且具備必定的交互性;
  • 其餘提供了Python調用接口的可視化工具:OpenGL, GraphViz等,這一類工具各有特色且在特定領域應用普遍.

對於數據科學,用的比較多的是matplotlib和seaborn,對數據進行動態或交互式展現時會用到plotly.github

 

1. matplotlib與MATLAB


Matplotlib是創建在NumPy數組基礎上的多平臺數據可視化程序庫,John Hunter在2002年提出了matplotlib的初步構想——在Python中畫出相似MATLAB風格的交互式圖形。鑑於此種淵源,相似MATLAB風格的畫圖接口是matplotlib的兩種畫圖接口之一。這類接口直觀、便捷,許多語法與MATLAB相似,也是初學者經常使用的方式。編程

這種接口最重要的特性是有狀態的(stateful):它會持續跟蹤"當前的"圖形和座標軸,全部plt命令均可以應用。能夠用plt.gcf()(獲取當前圖形)和plt.gca()(獲取當前座標軸)來查看具體信息。api

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)進行可視化ide

 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或聚類圖

使用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

相關文章
相關標籤/搜索