Seaborn的分類圖分爲三類,將分類變量每一個級別的每一個觀察結果顯示出來,顯示每一個觀察分佈的抽象表示,以及應用統計估計顯示的權重趨勢和置信區間:html
導入所須要的庫:算法
import numpy as np import matplotlib.pyplot as plt import seaborn as sns sns.set(style='darkgrid',color_codes=True) import pandas as pd import matplotlib as mpl
導入所須要的數據:數組
iris=sns.load_dataset('iris') tips=sns.load_dataset('tips') titanic=sns.load_dataset('titanic') tips.head()
當咱們的數據中有兩個變量,其中包含一個類別變量.另一個能夠是類別,也能夠是其餘的變量,這個時候咱們經常會用stripplot()函數來繪製兩者的關係.app
常見於用來分析label爲連續型變量(迴歸問題中的label),而咱們特徵中出現了分類l數據.dom
而針對這些問題,在seaborn中最經常使用的函數有striplot和searmplot函數.函數
sns.stripplot(x='day',y='total_bill',data=tips) #
可是咱們很快便發現一個較爲嚴重的問題,就是這樣沒法很好體現咱們label在某個點的分佈狀況,可能一個點附近有大量的點,但上面那個圖咱們倒是很難發現的(覆蓋太嚴重),爲了解決這個問題,咱們採用random jitter,將同一個地方的點隨機的分開,由於是隨機的,因此每次運行都會不同,具體的結果以下所示,這樣咱們就很容易的看到分類變量對於label的影響.工具
sns.stripplot(x='day',y='total_bill',data=tips,jitter=True)
雖然stripplot的jitter = True在必定程度上緩解了該問題,可是還有一個更好的函數swarmplot,該函數利用一種特定算法使得咱們的能更好的看到數據的分佈狀況.編碼
函數swarmplot(),它使用避免重疊點的算法將分類軸上的每一個散點圖點定位spa
sns.swarmplot(x='day',y='total_bill',data=tips)
還能夠傳入hue參數添加多個嵌套的分類變量。高於分類軸上的顏色和位置時冗餘的,如今每一個都提供有兩個變量之一的信息:設計
sns.swarmplot(x='day',y='total_bill',hue='sex',data=tips)
使用這些圖,將分類變量放在垂直軸上是很是有用的(當類別名稱相對較長或有不少類別時,這一點特別有用)。 您可使用orient關鍵字強制定向,但一般能夠從傳遞給x和/或y的變量的數據類型推斷繪圖方向:
sns.swarmplot(x='total_bill',y='day',hue='sex',data=tips)
① swarmplot的優點在當咱們的兩個變量都是分類變量的時候更加明顯.具體的參考下圖便可.
② swarmplot的缺點則是很是耗時,當數據量很是大的時候並不適用.
sns.stripplot(x='size',y='size',data=tips,jitter=True,ax=ax1) sns.swarmplot(x='size',y='size',data=tips,ax=ax2) plt.show()
在某種程度上,類別型數據的可視化可能會沒法反應某類中信息的一個分佈狀況,例如上面的day和total_bill的狀況,在不少狀況下較難看出究竟哪一天total_bill的好一點,尤爲在兩個類別中total都相近的時候(Sta,Sun),那此時咱們就須要另一些更好的可視化工具來幫助咱們完成這些任務.
而針對這些問題,在seaborn中最多見的函數有Boxplots和Violinplot函數.
sns.boxplot(x='day',y='total_bill',data=tips)
注意: 由於hue是和x,y變量嵌套的,當咱們使用hue變量的時候,它會被分割出來併產生"位移",也就是咱們看到的下面的一條線被分割成爲多條線的狀況. 有時爲了防止位移,咱們能夠設置dodge=False能夠抵消位移.
具體實例:
sns.boxplot(x="day", y="total_bill", hue="size", data=tips, dodge=False);
sns.boxplot(x="day", y="total_bill", hue="size", data=tips);
如上圖所示,選擇將dodge設置爲False,每一個變量都沒有位移,即每一個分類x軸對應的y都只有一個類型,那麼此時的位移反而會使得咱們的圖變得很難看.
tips["weekend"] = tips["day"].isin(["Sat", "Sun"]) sns.boxplot(x="day", y="total_bill", hue="weekend", data=tips, dodge=False);
violinplot(),它結合了箱體圖和分佈教程中描述的核心密度估計過程.
sns.violinplot(x="day", y="total_bill", hue="time", split=True, data=tips);
將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);
上面的幾種關於分類l特徵的可視化技術主要用以觀察數據的分佈的狀況,可是卻總感受缺了一些東西,到底是什麼呢?做爲作過一些數據分析的咱們很容易就明白,咱們不能僅僅只看數據的一個外在的表現,咱們須要一些工具將它的一些內在信息(主要是統計信息)反應出來,例如某類數據的總的個數,均值等狀況.
此處主要介紹barplot(條形圖)、countplot與piontplot(點圖)
barplot須要注意的是縱軸y默認的是計算的對應cate的均值
sns.barplot(x="sex", y="survived", data=titanic);
sns.barplot(x='sex',y='survived',hue='class',data=titanic)
barplot會默認將縱軸計算爲均值,這在二分類的時候很是有幫助,由於均值就是爲1的機率,可是是否是具備統計意義,咱們不能只看機率還得看個數,這個時候咱們就得用到countplot函數了,coutplot函數不能同時使用x,y因此若是想要統計某個cate變量對應的變量的個數最好用hue進行分開.例子以下:
sns.countplot(hue='sex',x='survived',data=titanic)
sns.countplot(hue='sex',x='survived',data=titanic,palette='Greens_d')
pointplot()函數提供了可視化相同信息的另外一種風格。該函數還對另外一軸的高度估計值進行編碼,而不是顯示一個完整的柱型,它只繪製點估計和置信區間。另外,這個函數和Barplot很類似,y特徵都是計算對應的機率,不一樣的是該函數更加豐富,它還會對相同的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=["-", "--"]);
sns.pointplot(x="sex", y="survived", hue="class", data=titanic, palette={"First": "g", "Second": "m", "Third":'b'}, 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");
此處咱們介紹兩個更加高級的方法.這些方法將上面的方法集中在一塊兒,但是隨時調用.上述的方法能夠經過kind = ""進行隨時的切換.
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips);
若是咱們但願barplot的形式的話,將kind設置爲bar便可.爲了對比,此處咱們也繪製barplot的形式,是否是發現和barplot同樣的結果.
sns.factorplot(x="day", y="total_bill", hue="smoker", kind = 'bar', data=tips);
sns.barplot(x="day", y="total_bill", hue="smoker", data=tips)
使用factorplot()的主要優勢是很容易調用"facet"展開更多其餘分類變量:
sns.factorplot(x="day", y="total_bill", hue="smoker", col="time", data=tips, kind="swarm");
sns.factorplot(x="time", y="total_bill", hue="smoker", col="day", data=tips, kind="box", size=4, aspect=.5);
任何一種圖形均可以畫出來。基於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");
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");
plt.show()
g = sns.PairGrid(tips,x_vars=["smoker", "time", "sex"],y_vars=["total_bill", "tip"],aspect=.75, size=3.5) g.map(sns.barplot, palette="pastel");
plt.show()
本文介紹了一些用於查看categorical變量與其餘變量(通常是label)之間關係的一些可視化技巧,其中主要涉及的包有:
seaborn.factorplot函數的全部參數說明,方便參考:
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:
參考:
[1] http://seaborn.pydata.org/tutorial/distributions.html
[2] http://seaborn.pydata.org/tutorial/categorical.html
[3] http://seaborn.pydata.org/tutorial/regression.html
[4] https://zhuanlan.zhihu.com/p/27683042
[5] https://www.kesci.com/apps/home/project/59f687e1c5f3f511952baca0