注:很早以前就打算專門寫一篇與Python數據可視化相關的博客,對一些基本概念和經常使用技巧作一個小結。今天終於有時間來完成這個計劃了!html
Python在數據科學中的地位,不只僅是由於numpy, scipy, pandas, scikit-learn這些高效易用、接口統一的科學計算包,其強大的數據可視化工具也是重要組成部分。在Python中,使用的最多的數據可視化工具是matplotlib,除此以外還有不少其餘可選的可視化工具包,主要包括如下幾大類:git
對於數據科學,用的比較多的是matplotlib和seaborn,對數據進行動態或交互式展現時會用到plotly.github
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"對象有一個特定的操做,畫圖的過程至上而下,畫好以後保存圖片。其餘命令說明以下:
在官方文檔中,這種風格的API被稱爲"pyplot API".
在面向對象編程中有一句口號:"一切皆對象",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實例後,就能夠直接操做這兩個實例來完成想要可視化效果。操做這兩個實例的方法衆多,可參考下面的官方文檔:
除了matplotlib以外,seaborn是專門爲統計製圖開發的可視化工具。除了直接用於數據的可視化以外,還可以完成一些常見的統計功能來輔助畫圖,例如偏差線的估計,密度估計,箱形圖分位數的計算等。此外,與matplotlib相比,seborn畫圖的風格更美觀。所以該可視化工具在數據分析中也用的比較多。
按照文檔中對API的介紹,seaborn主要將統計製圖分爲下面幾類:
使用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
matplotlib能夠畫大部分常見的圖,例如柱狀圖、折線圖、餅圖、直方圖等。
更多詳情能夠參考:Plotting-basic
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