seaborn教程4——分類數據可視化

https://segmentfault.com/a/1190000015310299

Seaborn學習大綱

seaborn的學習內容主要包含如下幾個部分:segmentfault

  1. 風格管理api

    • 繪圖風格設置
    • 顏色風格設置
  2. 繪圖方法數組

    • 數據集的分佈可視化
    • 分類數據可視化
    • 線性關係可視化
  3. 結構網格dom

    • 數據識別網格繪圖

本次將主要介紹 分類數據可視化的使用。機器學習

分類數據可視化

數據集中的數據類型有不少種,除了連續的特徵變量以外,最多見的就是類目型的數據類型了,常見的好比人的性別,學歷,愛好等。這些數據類型都不能用連續的變量來表示,而是用分類的數據來表示。函數

seaborn針對分類型的數據有專門的可視化函數,這些函數可大體分爲三種:學習

  • 分類數據散點圖: swarmplot(), stripplot()
  • 分類數據的分佈圖: boxplot(), violinplot()
  • 分類數據的統計估算圖 : barplot(), pointplot()

這三類函數可有特色,能夠從各個方面展現分類數據的可視化效果,下面咱們一一介紹。
首先的首先仍是先導入須要的模塊和數據集。spa

 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")

一、分類數據散點圖

在分類數據的基礎上展現定量數據的最簡單函數就是 stripplot()3d

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

 這看上去相似散點圖,但不一樣的是,橫座標是分類的數據,只不過一些數據點上會互相重疊,不便於觀察。因此一個簡單的解決辦法是加入jitter參數,調整橫座標位置。code

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);

 

 

 

 雖然分類的散點圖頗有用,但有時候想要快速查看各分類下的數據分佈就不是很直觀了。爲此,第二種函數解決了這個問題。

 二、箱型圖

經過箱型圖能夠很直觀的觀察到數據的四分位分佈(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);

 

 三、提琴圖

另外一種不一樣的方法是 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與上面函數的用法是同樣的。

三、 條形圖

咱們最熟悉的方式就是使用一個條形圖。 在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");

 

 

四、點圖

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=["-", "--"]);

 

 

 

 五、繪製「寬格式」數據

雖然使用「長格式」或「整潔」數據是優選的,可是這些函數也能夠應用於各類格式的「寬格式」數據,包括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");

 

 

六、繪製多層面板分類圖

正如咱們上面提到的,有兩種方法能夠在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");

相關文章
相關標籤/搜索