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