Seaborn(sns)官方文檔學習筆記(第五章 分類數據的繪製)

第五章 分類數據的繪製

我們之前探討了如何使用散點圖和回歸模型擬合來可視化兩個變數之間的關係,以及如何在其他分類變數的層次之間進行展示。 當然,還有一大類問題就是分類數據的問題了? 在這種情況下,散點圖和回歸模型方法將不起作用。當然,有幾個觀察可視化這種關係的選擇,我們將在本章中討論。

非常實用的方法是將Seaborn的分類圖分為三類,將分類變數每個級別的每個觀察結果顯示出來,顯示每個觀察分布的抽象表示,以及應用統計估計顯示的權重趨勢和置信區間:

  • 第一個包括函數swarmplot()和stripplot()
  • 第二個包括函數boxplot()和violinplot()
  • 第三個包括函數barplot()和pointplt()

在了解他們如何接受數據傳入方面,儘管每個參數都聚有控制應用於該數據可視化細節的特定參數,但這些功能都共享一個基本的API。

這與之前的regplot()和lmplot()的關係非常相似(未禾備註:在seaborn的構架中很容易分成這樣兩類用途相似,使用有所差異的替代方案函數)。在Seaborn中,相對低級別和相對高級別的方法用於定製分類數據的繪製圖,上面列出的函數都是低級別的,他們繪製在特定的matplotlib軸上。還有更高級別的factorplot()(未禾備註:這是一個非常簡明的快速繪製函數,具體用法會在最後有詳細介紹),它將這些功能與FacetGrid結合,以便在面板的網格中應用分類圖像。

使用「整潔」格式的DataFrame調用這些函數是最簡單和最好的,儘管較低級別的函數也接受寬形式的DataFrames或簡單的觀察向量。見下面的例子。

未禾備註:你甚至可以理解為這一章都是在具體學習factorplot()函數,快速、直接、功能強大的繪圖函數誰不愛?

%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as snssns.set(stylex="whitegrid", color_codes=True)np.random.seed(sum(map(ord, "categorical")))titanic = sns.load_dataset("titanic")tips = sns.load_dataset("tips")iris = sns.load_dataset("iris")

分類散點圖

顯示分類變數級別中某些定量變數的值的一種簡單方法使用stripplot(),它會將分散圖概括為其中一個變數是分類的:

sns.stripplot(x="day", y="total_bill", data=tips);

在條紋圖中,散點圖通常將重疊。這使得很難看到數據的完整分布。一個簡單的解決方案是使用一些隨機的「抖動」調整位置(僅沿著分類軸)

未禾備註:抖動是平時可視化中的常用的觀察「密度」的方法,除了使用參數抖動,特定的抖動需求也可以用numpy在數據上處理實現

sns.stripplot(x="day", y="total_bill", data=tips, jitter=True);

不同的方法是使用函數swarmplot(),它使用避免重疊點的演算法將分類軸上的每個散點圖點定位:

未禾備註:道理上,即使抖動還是會有重疊的可能,所以這種方法可能更好

sns.swarmplot(x="day", y="total_bill", data=tips);

當然也可以傳入hue參數添加多個嵌套的分類變數。高於分類軸上的顏色和位置時冗餘的,現在每個都提供有兩個變數之一的信息:

sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips);

一般來說,Seaborn分類繪圖功能試圖從數據中推斷類別的順序。 如果您的數據有一個pandas分類數據類型,那麼類別的默認順序可以在那裡設置。 對於其他數據類型,字元串類型的類別將按照它們在DataFrame中顯示的順序進行繪製,但是數組類別將被排序:

sns.swarmplot(x="size", y="total_bill", data=tips);

使用這些圖,將分類變數放在垂直軸上是非常有用的(當類別名稱相對較長或有很多類別時,這一點特別有用)。 您可以使用orient關鍵字強制定向,但通常可以從傳遞給x和/或y的變數的數據類型推斷繪圖方向:

sns.swarmplot(x="total_bill", y="day", hue="time", data=tips);

分類內的觀測分布

分類散點圖固然簡單實用,但在某些特定的的情況下,他們可以提供的值的分布信息會變得及其有限(並不明晰)。 有幾種方式可以方便的解決這個問題,在類別之間進行簡單比較並匯總信息,我們快速討論並比較一些適合這類數據觀測的函數。

箱線圖

第一個是熟悉的boxplot()。這種圖形顯示了分布的三個四分位值與極值。「晶須」延伸到低於和低四分位數的1.5 IQR內的點,然後獨立顯示落在該範圍之外的觀測值。 重要的是,這意味著boxplot中的每個值的顯示都對應於數據中的實際觀察值:

未禾備註:IQR即統計學概念四分位距,第一四分位與第三四分位之間的距離,具體內容請參考更深入的相關資料

sns.boxplot(x="day", y="total_bill", hue="time", data=tips);

提琴圖

不同的方法是一個violinplot(),它結合了箱體圖和分布教程中描述的核心密度估計過程:

未禾備註:核密度估計,即全文中提到的,或參數內傳入的kde,具體概念內容請參考相關文檔

sns.violinplot(x="total_bill", y="day", hue="time", data=tips);

這種方法使用核密度估計來更好地描述值的分布。此外,小提琴內還顯示了箱體四分位數和晶須值。由於小提琴使用KDE,還有一些其他可以調整的參數,相對於簡單的boxplot增加了一些複雜性:

sns.violinplot(x="total_bill", y="day", hue="time", data=tips, bw=.1, scale="count", scale_hue=False);

當色調參數只有兩個級別時,也可以傳入參數split至violinplot(),這樣可以更有效地利用空間:

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True);

最後,在繪製提琴圖的時候有幾個選項,包括顯示每個人的觀察結果而不是總結框圖值的方法:

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True, inner="stick", palette="Set3");

將swarmplot()或者swarmplot()與violinplot()或boxplot()結合使用可以顯示每個觀察結果以及分布的摘要:

未禾備註:說實話,並不推薦這麼做,過多的信息除了炫技沒有什麼實際用處。

sns.violinplot(x="day", y="total_bill", data=tips, inner=None)sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5);

類別內的統計估計

通常,不是顯示每個類別中的分布,你可能希望顯示值的集中趨勢。 Seaborn有兩種顯示此信息的主要方法,但重要的是,這些功能的基本API與上述相同。(未禾:這是多麼令人愉悅的事情)

條形圖

最熟悉的方式完成這個目標是一個條形圖。 在Seaborn中barplot()函數在完整數據集上運行,並顯示任意估計,默認情況下使用均值。 當在每個類別中有多個觀察值時,它還使用引導來計算估計周圍的置信區間,並繪製使用誤差條:

sns.barplot(x="sex", y="survived", hue="class", data=titanic);

條形圖的特殊情況是當您想要顯示每個類別中的觀察次數,而不是計算第二個變數的統計量。這類似於分類而不是定量變數的直方圖。在Seaborn中,使用countplot()函數很容易繪製:

未禾備註:函數將默認使用count參數作為x/y中未傳的一組維度

sns.countplot(x="deck", data=titanic, palette="Greens_d");

可以使用上面討論的所有選項來調用barplot()和countplot(),以及在每個函數的詳細文檔中的其他選項:

sns.countplot(y="deck", hue="class", data=titanic, palette="Greens_d");

點圖

pointplot()函數提供了可視化相同信息的另一種風格。該函數還對另一軸的高度估計值進行編碼,而不是顯示一個完整的柱型,它只繪製點估計和置信區間。另外,點圖連接相同hue類別的點。這使得很容易看出主要關係如何隨著第二個變數的變化而變化,因為你的眼睛很好地收集斜率的差異:

sns.pointplot(x="sex", y="survived", hue="class", data=titanic);

為了使能夠在黑白中重現的圖形,可以使用不同的標記和線條樣式來展示不同hue類別的層次:

sns.pointplot(x="class", y="survived", hue="sex", data=titanic, palette={"male": "g", "female": "m"}, markers=["^", "o"], linestyles=["-", "--"]);

繪製「寬格式」數據

雖然使用「長格式」或「整潔」數據是優選的,但是這些功能也可以應用於各種格式的「寬格式」數據,包括pandas DataFrame或二維numpy數組陣列。這些對象應該直接傳遞給數據參數:

sns.boxplot(data=iris,orient="h");

此外,這些函數接受Pandas或numpy對象的向量,而不是DataFrame中的變數

sns.violinplot(x=iris.species, y=iris.sepal_length);

為了控制由上述功能製作的圖形的大小和形狀,您必須使用matplotlib命令自己設置圖形。 當然,這也意味著這些圖塊可以和其他種類的圖塊一起在一個多面板的繪製中共存:

f, ax = plt.subplots(figsize=(7, 3))sns.countplot(y="deck", data=titanic, color="c");

繪製多層面板分類圖

正如我們上面提到的,有兩種方法可以在Seaborn中繪製分類圖。與回歸圖中的二元性相似,您可以使用上面介紹的函數,也可以使用更高級別的函數factorplot(),將這些函數與FacetGrid()相結合,通過這個圖形的更大的結構來增加展示其他類別的能力。 默認情況下,factorplot()產生一個pairplot():

sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips);

然而,kind參數可以讓您選擇以上討論的任何種類的圖:

sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar");

使用factorplot()的主要優點是很容易調用"facet"展開更多其他分類變數:

sns.factorplot(x="day", y="total_bill", hue="smoker", col="time", data=tips, kind="swarm");

任何一種圖形都可以畫出來。基於FacetGrid的工作原理,要更改圖形的大小和形狀,需要指定適用於每個方面的size和aspect參數:

sns.factorplot(x="time", y="total_bill", hue="smoker", col="day", data=tips, kind="box", size=4, aspect=.5);

重要的是要注意,你也可以直接使用boxplot()和FacetGrid來製作這個圖。但是,必須特別注意確保分類變數的順序在每個方面實施,方法是使用具有Categorical數據類型的數據或通過命令和hue_order。

sns.factorplot(x="time", y="total_bill", hue="smoker",hue_order=["No","Yes"] ,col="day", data=tips, kind="box", size=4, aspect=.5, palette="Set3");

由於分類圖的廣義API,它們應該很容易應用於其他更複雜的上下文。 例如,它們可以輕鬆地與PairGrid結合,以顯示多個不同變數之間的分類關係:

g = sns.PairGrid(tips, x_vars=["smoker", "time", "sex"], y_vars=["total_bill", "tip"], aspect=.75, size=3.5)g.map(sns.violinplot, palette="pastel");

補充資料

最後在這章翻譯結束後,未禾專門收集了這個重要函數的所有參數說明,方便參考:

seaborn.factorplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=<function mean>, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind=point, size=4, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None, **kwargs)

Parameters:

  • x,y,hue 數據集變數 變數名
  • date 數據集 數據集名
  • row,col 更多分類變數進行平鋪顯示 變數名
  • col_wrap 每行的最高平鋪數 整數
  • estimator 在每個分類中進行矢量到標量的映射 矢量
  • ci 置信區間 浮點數或None
  • n_boot 計算置信區間時使用的引導迭代次數 整數
  • units 採樣單元的標識符,用於執行多級引導和重複測量設計 數據變數或向量數據
  • order, hue_order 對應排序列表 字元串列表
  • row_order, col_order 對應排序列表 字元串列表
  • kind : 可選:point 默認, bar 柱形圖, count 頻次, box 箱體, violin 提琴, strip 散點,swarm 分散點(具體圖形參考文章前部的分類介紹)
  • size 每個面的高度(英寸) 標量
  • aspect 縱橫比 標量
  • orient 方向 "v"/"h"
  • color 顏色 matplotlib顏色
  • palette 調色板 seaborn顏色色板或字典
  • legend hue的信息面板 True/False
  • legend_out 是否擴展圖形,並將信息框繪製在中心右邊 True/False
  • share{x,y} 共享軸線 True/False
  • facet_kws FacetGrid的其他參數 字典

感慨

終於抽時間把最重要的三章翻譯完了,有了這三章seaborn在數據挖掘中已經可以覆蓋到大部分數據格式,其快速做圖能力已經可以得到足量的發揮。最近工作壓力日趨增大,全文還有最難翻譯的一章,會堅持在最近放出。最後吐槽下知乎的排版,代碼+貼圖非常不方便,費時費力唉。

如果文章對你有幫助,請不吝點個贊,方便更多的小夥伴能看到。

如果文章有理解、翻譯謬誤請留言,十分感謝!

【第五章完】

【未禾原創,所有章節已經完結,其他章節請點擊跳轉】

Seaborn(sns)官方文檔學習筆記(第一章 藝術化的圖表控制) - 知乎專欄

Seaborn(sns)官方文檔學習筆記(第二章 斑駁陸離的調色板) - 知乎專欄

Seaborn(sns)官方文檔學習筆記(第三章 分布數據集的可視化) - 知乎專欄

Seaborn(sns)官方文檔學習筆記(第四章 線性關係的可視化) - 知乎專欄

Seaborn(sns)官方文檔學習筆記(第五章 分類數據的繪製) - 知乎專欄

Seaborn(sns)官方文檔學習筆記(第六章 繪製數據網格) - 知乎專欄

推薦閱讀:

Python黑帽編程 3.1 ARP欺騙
最好的 Python 網站開發方面的學習教程有哪些?
python里函數作為返回值如何進行比較?
如何寫python2和3兼容代碼?

TAG:Matplotlib | Python | 数据挖掘 |