Python中最常用于數(shù)據(jù)可視化的工具庫包括Matplotlib和Seaborn。其中,Matplotlib屬于 Python 數(shù)據(jù)可視化的基礎(chǔ)庫,具備很高的靈活度,但應(yīng)用過于復(fù)雜——官方文檔有3000 多頁,包含上千個方法以及數(shù)萬個參數(shù)。
對于快捷地進行數(shù)據(jù)分析可視化而言,Seaborn是一個更簡單易用的選擇。Seaborn 基于 Matplotlib 核心庫進行了更高階的 API 封裝,可以輕松地畫出更漂亮的圖形。Seaborn 的漂亮主要體現(xiàn)在配色更加舒服、以及圖形元素的樣式更加細(xì)膩。下面是 Seaborn 官方給出的參考圖。
Matplotlib 繪圖的默認(rèn)圖像樣式算不上美觀,可以使用 Seaborn 完成快速優(yōu)化。
使用 Matplotlib 繪制一張簡單的圖像。
import matplotlib.pyplot as plt%matplotlib inlinex = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]y_bar = [3, 4, 6, 8, 9, 10, 9, 11, 7, 8]y_line = [2, 3, 5, 7, 8, 9, 8, 10, 6, 7]plt.bar(x, y_bar)plt.plot(x, y_line, '-o', color='y')
使用 Seaborn 完成圖像快速優(yōu)化。
方法非常簡單,只需要將 Seaborn 提供的樣式聲明代碼 sns.set() 放置在繪圖前即可。
import seaborn as snssns.set() # 聲明使用 Seaborn 樣式plt.bar(x, y_bar)plt.plot(x, y_line, '-o', color='y')
可以發(fā)現(xiàn),相比于 Matplotlib 默認(rèn)的純白色背景,Seaborn 默認(rèn)的淺灰色網(wǎng)格背景看起來的確要細(xì)膩舒適一些。而柱狀圖的色調(diào)、坐標(biāo)軸的字體大小也都有一些變化。
sns.set() 的默認(rèn)參數(shù)為:
sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=False, rc=None)
Seaborn 一共擁有 50 多個 API 類,相比于 Matplotlib 數(shù)千個的規(guī)模,可以說是非常精簡了。根據(jù)圖形的適應(yīng)場景,Seaborn 的繪圖方法大致分類 6 類,這 6 大類下面又包含不同數(shù)量的繪圖函數(shù):
接下來,我們通過『鳶尾花示例數(shù)據(jù)集』進行演示,使用 Seaborn 繪制適應(yīng)不同場景的圖形。首先導(dǎo)入數(shù)據(jù)集:
iris = sns.load_dataset('iris')iris.head()
在繪圖之前,先熟悉一下 iris 鳶尾花數(shù)據(jù)集。
數(shù)據(jù)集總共 150 行,由 5 列組成。分別代表:萼片長度、萼片寬度、花瓣長度、花瓣寬度、花的類別。其中,前四列均為數(shù)值型數(shù)據(jù),最后一列花的分類為三種,分別是:Iris Setosa、Iris Versicolour、Iris Virginica。
3.1 關(guān)聯(lián)圖
當(dāng)我們需要對數(shù)據(jù)進行關(guān)聯(lián)性分析時,可能會用到 Seaborn 提供的以下幾個 API。
relplot 是 relational plots 的縮寫,用于呈現(xiàn)數(shù)據(jù)之后的關(guān)系。relplot 主要有散點圖和線形圖2種樣式,適用于不同類型的數(shù)據(jù)。
(1)散點圖
指定 xx 和 yy 的特征,默認(rèn)可以繪制出散點圖。
sns.relplot(x='sepal_length', y='sepal_width', data=iris)
但是,上圖并不能看出數(shù)據(jù)類別之間的聯(lián)系。如果我們加入類別特征對數(shù)據(jù)進行著色,就更加直觀了。
sns.relplot(x='sepal_length', y='sepal_width', hue='species', data=iris)
Seaborn 的函數(shù)都有大量實用的參數(shù)。例如我們指定 style 參數(shù)可以賦予不同類別的散點不同的形狀。更多的參數(shù),希望大家通過閱讀 官方文檔 進行了解。
sns.relplot(x='sepal_length', y='sepal_width', hue='species', style='species', data=iris)
(2)線形圖
relplot 方法還支持線形圖,此時只需要指定 kind=”line” 參數(shù)即可。圖中陰影部分是自動給出的 95% 置信區(qū)間。
sns.relplot(x='sepal_length', y='petal_length', hue='species', style='species', kind='line', data=iris)
(3)API 層級:Axes-level 和 Figure-level
Seaborn 中有 API 層級的概念。Seaborn 中的 API 分為 Axes-level 和 Figure-level 兩種:Axes-level 的函數(shù)可以實現(xiàn)與 Matplotlib 更靈活和緊密的結(jié)合,而 Figure-level 則更像是「懶人函數(shù)」,適合于快速應(yīng)用。
你會發(fā)現(xiàn),上面我們一個提到了 3 個 API,分別是:relplot,scatterplot 和 lineplot。scatterplot 和 lineplot 就是 Axes-level 接口,relplot 則是 Figure-level 接口,也可以被看作是 scatterplot 和 lineplot 的結(jié)合版本。
例如,上方 relplot 繪制的圖也可以使用 lineplot 函數(shù)繪制,只要取消 relplot 中的 kind 參數(shù)即可。
sns.lineplot(x='sepal_length', y='petal_length', hue='species', style='species', data=iris)
3.2 類別圖
與關(guān)聯(lián)圖相似,類別圖的 Figure-level 接口是 catplot,其為 categorical plots 的縮寫。而 catplot 實際上是如下 Axes-level 繪圖 API 的集合:
(1)散點圖 strip / swarm
下面,我們看一下 catplot 繪圖效果。該方法默認(rèn)是繪制 kind='strip' 散點圖。
sns.catplot(x='sepal_length', y='species', data=iris)
kind='swarm' 可以讓散點按照 beeswarm 的方式防止重疊,可以更好地觀測數(shù)據(jù)分布。
sns.catplot(x='sepal_length', y='species', kind='swarm', data=iris)
同理,hue= 參數(shù)可以給圖像引入另一個維度,由于 iris 數(shù)據(jù)集只有一個類別列,我們這里就不再添加 hue= 參數(shù)了。如果一個數(shù)據(jù)集有多個類別,hue= 參數(shù)就可以讓數(shù)據(jù)點有更好的區(qū)分。
(2)箱線圖 box
接下來,我們依次嘗試其他幾種圖形的繪制效果。繪制箱線圖:
sns.catplot(x='sepal_length', y='species', kind='box', data=iris)
(3)增強箱線圖 boxen
sns.catplot(x='species', y='sepal_length', kind='boxen', data=iris)
(4)小提琴圖 violin
sns.catplot(x='sepal_length', y='species', kind='violin', data=iris)
(5)點線圖 point
sns.catplot(x='sepal_length', y='species', kind='point', data=iris)
(6)條形圖 bar
sns.catplot(x='sepal_length', y='species', kind='bar', data=iris)
(7)計數(shù)條形圖 count
sns.catplot(x='species', kind='count', data=iris)
3.3 分布圖
分布圖主要是用于可視化變量的分布情況,一般分為單變量分布和多變量分布(多指二元變量)。
Seaborn 提供的分布圖繪制方法一般有這幾個:distplot、kdeplot、jointplot、pairplot。接下來,我們依次來看一下這些繪圖方法的使用。
(1)單變量分布圖 distplot
Seaborn 快速查看單變量分布的方法是 distplot。默認(rèn)情況下,該方法將繪制直方圖并擬合核密度估計圖。
sns.distplot(iris['sepal_length'])
distplot 提供了參數(shù)來調(diào)整直方圖和核密度估計圖。例如,設(shè)置 kde=False 則可以只繪制直方圖,或者 hist=False 只繪制核密度估計圖。
(2)核密度估計圖 kdeplot
當(dāng)然,kdeplot 可以專門用于繪制核密度估計圖,其效果和 distplot(hist=False) 一致,但 kdeplot 擁有更多的自定義設(shè)置。
sns.kdeplot(iris['sepal_length'])
(3)二元變量分布圖 jointplot
jointplot 主要是用于繪制二元變量分布圖。例如,我們探尋 sepal_length 和 sepal_width 二元特征變量之間的關(guān)系。
sns.jointplot(x='sepal_length', y='sepal_width', data=iris)
jointplot 并不是一個 Figure-level 接口,但其支持 kind= 參數(shù)指定繪制出不同樣式的分布圖。
例如,繪制出核密度估計對比圖 kde
sns.jointplot(x='sepal_length', y='sepal_width', data=iris, kind='kde')
繪制六邊形計數(shù)圖 hex
sns.jointplot(x='sepal_length', y='sepal_width', data=iris, kind='hex')
繪制回歸擬合圖 reg
sns.jointplot(x='sepal_length', y='sepal_width', data=iris, kind='reg')
(4)變量兩兩對比圖 pairplot
最后要介紹的 pairplot 更加強大,其支持一次性將數(shù)據(jù)集中的特征變量兩兩對比繪圖。默認(rèn)情況下,對角線上是單變量分布圖,而其他則是二元變量分布圖。
sns.pairplot(iris)
此時,我們引入第三維度 hue='species'會更加直觀。
sns.pairplot(iris, hue='species')
3.4 回歸圖
接下來,我們繼續(xù)介紹回歸圖,回歸圖的繪制函數(shù)主要有:lmplot 和 regplot。
(1)regplot
regplot 繪制回歸圖時,只需要指定自變量和因變量即可,regplot 會自動完成線性回歸擬合。
sns.regplot(x='sepal_length', y='sepal_width', data=iris)
(2)lmplot
lmplot 同樣是用于繪制回歸圖,但 lmplot 支持引入第三維度進行對比,例如我們設(shè)置 hue='species'。
sns.lmplot(x='sepal_length', y='sepal_width', hue='species', data=iris)
3.5 矩陣圖
矩陣圖中最常用的就只有 2 個,分別是:heatmap 和 clustermap。
(1)熱力圖 heatmap
意如其名,heatmap 主要用于繪制熱力圖。熱力圖在某些場景下非常實用,例如繪制出變量相關(guān)性系數(shù)熱力圖。
import numpy as npsns.heatmap(np.random.rand(10, 10))
(2)層次聚類結(jié)構(gòu)圖clustermap
除此之外,clustermap 支持繪制層次聚類結(jié)構(gòu)圖。如下所示,我們先去掉原數(shù)據(jù)集中最后一個目標(biāo)列,傳入特征數(shù)據(jù)即可。當(dāng)然,你需要對層次聚類有所了解,否則很難看明白圖像多表述的含義。
iris.pop('species')sns.clustermap(iris)
瀏覽官方文檔,會發(fā)現(xiàn) Seaborn 中還存在大量已大些字母開始的類,例如 JointGrid,PairGrid 等。實際上這些類只是其對應(yīng)小寫字母的函數(shù) jointplot,pairplot 的進一步封裝。當(dāng)然,二者可能稍有不同,但并沒有本質(zhì)的區(qū)別。
除此之外,Seaborn 官方文檔 中還有關(guān)于 樣式控制 和 色彩自定義 等一些輔助組件的介紹。對于這些 API 的應(yīng)用沒有太大的難點,重點需要勤于練習(xí)。