https://segmentfault.com/a/1190000015310299
Seaborn學習大綱
seaborn
的學習內容主要包含以下幾個部分:
-
風格管理
- 繪圖風格設置
- 顏色風格設置
-
繪圖方法
- 數據集的分布可視化
分類數據可視化
- 線性關系可視化
-
結構網格
- 數據識別網格繪圖
本次將主要介紹 分類數據可視化
的使用。
分類數據可視化
數據集中的數據類型有很多種,除了連續的特征變量之外,最常見的就是類目型的數據類型了,常見的比如人的性別,學歷,愛好等。這些數據類型都不能用連續的變量來表示,而是用分類的數據來表示。
seaborn
針對分類型的數據有專門的可視化函數,這些函數可大致分為三種:
- 分類數據散點圖: swarmplot(), stripplot()
- 分類數據的分布圖: boxplot(), violinplot()
- 分類數據的統計估算圖 : barplot(), pointplot()
這三類函數可有特點,可以從各個方面展示分類數據的可視化效果,下面我們一一介紹。
首先的首先還是先導入需要的模塊和數據集。
1 %matplotlib inline 2 import numpy as np 3 import pandas as pd 4 import matplotlib as mpl 5 import matplotlib.pyplot as plt 6 import seaborn as sns 7 sns.set(style="whitegrid", color_codes=True) 8 np.random.seed(sum(map(ord, "categorical"))) 9 titanic = sns.load_dataset("titanic") 10 tips = sns.load_dataset("tips") 11 iris = sns.load_dataset("iris")
1、分類數據散點圖
在分類數據的基礎上展示定量數據的最簡單函數就是 stripplot()
1 sns.stripplot(x="day", y="total_bill", data=tips);
這看上去類似散點圖,但不同的是,橫坐標是分類的數據,只不過一些數據點上會互相重疊,不便於觀察。所以一個簡單的解決辦法是加入jitter
參數,調整橫坐標位置。
sns.swarmplot(x="day", y="total_bill", data=tips,jitter=True
);
當然,還有一個不同的方法就是使用 swarmplot() 函數,這個函數的好處就是所有的點都不會重疊,這樣可以很清晰的觀察到數據的分布。
1 sns.swarmplot(x="day", y="total_bill", data=tips);
在這基礎上,也可以通過 hue 參數加入另一個嵌套的分類變量,而且嵌套的分類變量可以以不同的顏色區別,十分方便。
1 sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips);
通常情況下,seaborn 還會嘗試推斷出分類變量的順序。如果你的數據是 pandas 的分類數據類型,那么就是使用默認的分類數據順序,如果是其他的數據類型,字符串類型的類別將按照它們在DataFrame中顯示的順序進行繪制,但是數組類別將被排序。
1 sns.swarmplot(x="size", y="total_bill", data=tips);
有時候將分類變量放在垂直軸上是非常有用的(當類別名稱相對較長或有很多類別時,這一點特別有用)。 可以使用 orient 關鍵字強制定向,但通常可以互換x和y的變量的數據類型來完成:
1 sns.swarmplot(x="total_bill", y="day", hue="time", data=tips);
雖然分類的散點圖很有用,但有時候想要快速查看各分類下的數據分布就不是很直觀了。為此,第二種函數解決了這個問題。
2、箱型圖
通過箱型圖可以很直觀的觀察到數據的四分位分布(1/4分位,中位數,3/4分位,以及四分位距),這種可視化對於在機器學習的預處理階段(尤其是發現數據異常離散值)十分有效。
1 sns.boxplot(x="day", y="total_bill", hue="time", data=tips);
對於箱型圖來說,使用 hue 參數的假設是這個變量嵌套在x或者y軸內。所以默認的情況下,hue 變量的不同類型值會保持偏置狀態(兩類或幾類數據共同在x軸數據類型的一個類中),就像上面那個圖所示。但是如果 hue 所使用的變量不是嵌套的,那么你可以使用 dodge 參數來禁止這個默認的偏置狀態。
1 tips["weekend"] = tips["day"].isin(["Sat", "Sun"]) 2 sns.boxplot(x="day", y="total_bill", hue="weekend", data=tips, dodge=False);
3、提琴圖
另一種不同的方法是 violinplot() 函數,它結合了箱體圖和分布教程中描述的核心密度估計過程:
1 sns.violinplot(x="total_bill", y="day", hue="time", data=tips);
這種方法使用核密度估計來更好地描述值的分布。此外,小提琴內還顯示了箱體四分位數和四分位距。由於小提琴使用KDE,還有一些其他可以調整的參數,相對於簡單的boxplot增加了一些復雜性:
1 sns.violinplot(x="total_bill", y="day", hue="time", data=tips, 2 bw=.1, scale="count", scale_hue=False);
當 hue 的嵌套類型只有兩類的時候,也可以使用split 參數將小提琴分割:
1 sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True);
在提琴圖內,也可以使用 inner 參數以橫線的形式來展示每個觀察點的分布,來代替箱型的整體分布:
1 sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, 2 split=True, inner="stick", palette="Set3");
還有一點比較好的是,可以將 swarmplot(),violinplot(),或 boxplot() 混合使用,這樣可以結合多種繪圖的特點展示更完美的效果。
1 sns.violinplot(x="day", y="total_bill", data=tips, inner=None) 2 sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5);
有時候,我們不想展示分類數據下的分布,而是想展示每一類的集中趨勢。seaborn 有兩個主要的方法來展示這個,並且這些函數api與上面函數的用法是一樣的。
3、 條形圖
我們最熟悉的方式就是使用一個條形圖。 在Seaborn中barplot()函數會在整個數據集上顯示估計,默認情況下使用均值進行估計。 當在每個類別中有多個類別時(使用了 hue),它可以使用引導來計算估計的置信區間,並使用誤差條來表示置信區間:
1 sns.barplot(x="sex", y="survived", hue="class", data=titanic);
條形圖的特殊情況是當您想要顯示每個類別的數量,而不是計算統計量。這有點類似於一個分類而不是定量變量的直方圖。在Seaborn中,使用countplot()函數很輕易的完成:
1 sns.countplot(x="deck", data=titanic, palette="Greens_d");
如果將要計數的變量移動到y軸上,那么條形就會橫過來顯示:
1 sns.countplot(y="deck", hue="class", data=titanic, palette="Greens_d");
4、點圖
pointplot()函數提供了估計可視化的另一種風格。該函數會用高度估計值對數據進行描述,而不是顯示一個完整的條形,它只繪制點估計和置信區間。另外,點圖連接相同hue類別的點,比如male中的藍色會連接female中的藍色。這使得很容易看出主要關系如何隨着第二個變量的變化而變化,因為你的眼睛可以很好地辨別斜率的差異:
1 sns.pointplot(x="sex", y="survived", hue="class", data=titanic);
為了使能夠更好的顯示,可以使用不同的標記和線條樣式來展示不同hue類別的層次:
1 sns.pointplot(x="class", y="survived", hue="sex", data=titanic, 2 palette={"male": "g", "female": "m"}, 3 markers=["^", "o"], linestyles=["-", "--"]);
5、繪制“寬格式”數據
雖然使用“長格式”或“整潔”數據是優選的,但是這些函數也可以應用於各種格式的“寬格式”數據,包括pandas DataFrame或二維numpy數組陣列。這些對象應該直接傳遞給數據參數:
1 sns.boxplot(data=iris, orient="h");
此外,這些函數也接受Pandas或numpy對象的向量,而不僅僅是DataFrame中的變量:
1 sns.violinplot(x=iris.species, y=iris.sepal_length);
為了控制由上述函數制作的圖形的大小和形狀,你必須使用matplotlib命令自己設置圖形。 當然,這也意味着這些圖塊可以和其他種類的圖塊一起在一個多面板的繪制中共存:
1 f, ax = plt.subplots(figsize=(7, 3)) 2 sns.countplot(y="deck", data=titanic, color="c");
6、繪制多層面板分類圖
正如我們上面提到的,有兩種方法可以在Seaborn中繪制分類圖。與回歸圖中的二元性相似,您可以使用上面介紹的函數,也可以使用更高級別的函數factorplot(),將這些函數與FacetGrid()相結合,通過這個圖形的更大的結構來增加展示其他類別的能力。 默認情況下,factorplot()產生一個pairplot():
1 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"繪制多面圖,展示更多其他分類變量:
1 sns.factorplot(x="day", y="total_bill", hue="smoker", 2 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。
1 sns.factorplot(x="time", y="total_bill", hue="smoker",hue_order=["No","Yes"] 2 ,col="day", data=tips, kind="box", size=4, aspect=.5, 3 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");