詳解seaborn可視化中的kdeplot、rugplot、distplot與jointplot

點(diǎn)擊上方"藍(lán)字"關(guān)注我們
記錄? ?分享? ?成長(zhǎng)
一、seaborn簡(jiǎn)介
seaborn是Python中基于matplotlib的具有更多可視化功能和更優(yōu)美繪圖風(fēng)格的繪圖模塊,當(dāng)我們想要探索單個(gè)或一對(duì)數(shù)據(jù)分布上的特征時(shí),可以使用到seaborn中內(nèi)置的若干函數(shù)對(duì)數(shù)據(jù)的分布進(jìn)行多種多樣的可視化。

本文以jupyter notebook為編輯工具,針對(duì)seaborn中的kdeplot、rugplot、distplot和jointplot,對(duì)其參數(shù)設(shè)置和具體用法進(jìn)行詳細(xì)介紹。
二、kdeplot
seaborn中的kdeplot可用于對(duì)單變量和雙變量進(jìn)行核密度估計(jì)并可視化,其主要參數(shù)如下:
data:一維數(shù)組,單變量時(shí)作為唯一的變量
data2:格式同data2,單變量時(shí)不輸入,雙變量作為第2個(gè)輸入變量
shade:bool型變量,用于控制是否對(duì)核密度估計(jì)曲線下的面積進(jìn)行色彩填充,True代表填充
vertical:bool型變量,在單變量輸入時(shí)有效,用于控制是否顛倒x-y軸位置
kernel:字符型輸入,用于控制核密度估計(jì)的方法,默認(rèn)為'gau',即高斯核,特別地在2維變量的情況下僅支持高斯核方法
legend:bool型變量,用于控制是否在圖像上添加圖例
cumulative:bool型變量,用于控制是否繪制核密度估計(jì)的累計(jì)分布,默認(rèn)為False
shade_lowest:bool型變量,用于控制是否為核密度估計(jì)中最低的范圍著色,主要用于在同一個(gè)坐標(biāo)軸中比較多個(gè)不同分布總體,默認(rèn)為True
cbar:bool型變量,用于控制是否在繪制二維核密度估計(jì)圖時(shí)在圖像右側(cè)邊添加比色卡
color:字符型變量,用于控制核密度曲線色彩,同plt.plot()中的color參數(shù),如'r'代表紅色
cmap:字符型變量,用于控制核密度區(qū)域的遞進(jìn)色彩方案,同plt.plot()中的cmap參數(shù),如'Blues'代表藍(lán)色系
n_levels:int型,在而為變量時(shí)有效,用于控制核密度估計(jì)的區(qū)間個(gè)數(shù),反映在圖像上的閉環(huán)層數(shù)
下面我們來(lái)看幾個(gè)示例來(lái)熟悉kdeplot中上述參數(shù)的實(shí)際使用方法:
首先我們需要準(zhǔn)備數(shù)據(jù),本文使用seaborn中自帶的鳶尾花數(shù)據(jù)作為示例數(shù)據(jù),因?yàn)樵趈upyter notebook中運(yùn)行代碼,所以加上魔術(shù)命令%matplotlib inline使得圖像得以在notebook中顯示。
import?seaborn?as?sns
sns.set(color_codes=True)
import?matplotlib.pyplot?as?plt
%matplotlib?inline
#加載seaborn自帶的鳶尾花數(shù)據(jù)集,格式為數(shù)據(jù)框
iris?=?sns.load_dataset('iris')
#分離出setosa類的花對(duì)應(yīng)的屬性值
setosa?=?iris.loc[iris.species?==?"setosa"].reset_index(drop=True)
#分離出virginica類的花對(duì)應(yīng)的屬性值
virginica?=?iris.loc[iris.species?==?"virginica"].reset_index(drop=True)
首先我們不修改其他參數(shù)只傳入數(shù)據(jù)來(lái)觀察繪制出的圖像:
#繪制iris中petal_width參數(shù)的核密度估計(jì)圖
ax?=?sns.kdeplot(iris.petal_width)

加上紅色填充顏色,并禁止圖例顯示:
ax?=?sns.kdeplot(iris.petal_width,shade=True,color='r')

修改為核密度分布:
ax?=?sns.kdeplot(iris.petal_width,
?????????????????shade=True,
?????????????????color='r',
?????????????????cumulative=True)

交換x-y軸位置:
ax?=?sns.kdeplot(iris.petal_width,
?????????????????shade=True,
?????????????????color='r',
?????????????????vertical=True)

下面我們來(lái)繪制雙變量聯(lián)合核密度估計(jì)圖:
#繪制setosa花的petal_width與petal_length的聯(lián)合核密度估計(jì)圖
ax?=?sns.kdeplot(setosa.petal_width,
?????????????????setosa.petal_length)

修改調(diào)色方案為藍(lán)色,并設(shè)置shade_lowest=True:
ax?=?sns.kdeplot(setosa.petal_width,
?????????????????setosa.petal_length,
?????????????????cmap='Blues',
?????????????????shade=True,
?????????????????shade_lowest=True)

在上圖基礎(chǔ)上修改shade_lowest=False:
ax?=?sns.kdeplot(setosa.petal_width,
?????????????????setosa.petal_length,
?????????????????cmap='Blues',
?????????????????shade=True,
?????????????????shade_lowest=False)

可以看到這時(shí)最低密度估計(jì)曲線之外的區(qū)域沒(méi)有被調(diào)色方案所浸染。
將核密度曲線區(qū)間個(gè)數(shù)修改為5:
ax?=?sns.kdeplot(setosa.petal_width,
?????????????????setosa.petal_length,
?????????????????cmap='Blues',
?????????????????shade=True,
?????????????????shade_lowest=False,
?????????????????n_levels=5)

可以看到這時(shí)的核密度區(qū)間要粗略很多。
在同一個(gè)子圖中繪制兩個(gè)不同一維總體的核密度估計(jì)圖,這里為了把它們區(qū)分開(kāi)分別定義了label參數(shù)以顯示在圖例中:
ax1?=?sns.kdeplot(setosa.petal_width,label='setosa.petal_width')
ax2?=?sns.kdeplot(virginica.petal_width,label='virginica.petal_width')

在同一個(gè)子圖中繪制兩個(gè)不同二維總體的核密度估計(jì)圖:
ax1?=?sns.kdeplot(setosa.sepal_width,setosa.sepal_length,
??????????????????cmap='Blues',
??????????????????shade=True,
??????????????????shade_lowest=False)
ax2?=?sns.kdeplot(virginica.sepal_width,virginica.sepal_length,
??????????????????cmap='Greens',
??????????????????shade=True,
??????????????????shade_lowest=False)

三、rugplot
rugplot的功能非常樸素,用于繪制出一維數(shù)組中數(shù)據(jù)點(diǎn)實(shí)際的分布位置情況,即不添加任何數(shù)學(xué)意義上的擬合,單純的將記錄值在坐標(biāo)軸上表現(xiàn)出來(lái),相對(duì)于kdeplot,其可以展示原始的數(shù)據(jù)離散分布情況,其主要參數(shù)如下:
a:一維數(shù)組,傳入觀測(cè)值向量
height:設(shè)置每個(gè)觀測(cè)點(diǎn)對(duì)應(yīng)的小短條的高度,默認(rèn)為0.05
axis:字符型變量,觀測(cè)值對(duì)應(yīng)小短條所在的軸,默認(rèn)為'x',即x軸
使用默認(rèn)參數(shù)進(jìn)行繪制:
ax?=?sns.rugplot(iris.petal_length)

調(diào)換所處的坐標(biāo)軸:
ax?=?sns.rugplot(iris.petal_length,axis='y')

修改小短條高度和顏色:
ax?=?sns.rugplot(iris.petal_length,
?????????????????color='r',
?????????????????height=0.2)

四、distplot
seaborn中的distplot主要功能是繪制單變量的直方圖,且還可以在直方圖的基礎(chǔ)上施加kdeplot和rugplot的部分內(nèi)容,是一個(gè)功能非常強(qiáng)大且實(shí)用的函數(shù),其主要參數(shù)如下:
a:一維數(shù)組形式,傳入待分析的單個(gè)變量
bins:int型變量,用于確定直方圖中顯示直方的數(shù)量,默認(rèn)為None,這時(shí)bins的具體個(gè)數(shù)由Freedman-Diaconis準(zhǔn)則來(lái)確定
hist:bool型變量,控制是否繪制直方圖,默認(rèn)為True
kde:bool型變量,控制是否繪制核密度估計(jì)曲線,默認(rèn)為True
rug:bool型變量,控制是否繪制對(duì)應(yīng)rugplot的部分,默認(rèn)為False
fit:傳入scipy.stats中的分布類型,用于在觀察變量上抽取相關(guān)統(tǒng)計(jì)特征來(lái)強(qiáng)行擬合指定的分布,下文的例子中會(huì)有具體說(shuō)明,默認(rèn)為None,即不進(jìn)行擬合
hist_kws,kde_kws,rug_kws:這幾個(gè)變量都接受字典形式的輸入,鍵值對(duì)分別對(duì)應(yīng)各自原生函數(shù)中的參數(shù)名稱與參數(shù)值,在下文中會(huì)有示例
color:用于控制除了fit部分?jǐn)M合出的曲線之外的所有對(duì)象的色彩
vertical:bool型,控制是否顛倒x-y軸,默認(rèn)為False,即不顛倒
norm_hist:bool型變量,用于控制直方圖高度代表的意義,為True直方圖高度表示對(duì)應(yīng)的密度,為False時(shí)代表的是對(duì)應(yīng)的直方區(qū)間內(nèi)記錄值個(gè)數(shù),默認(rèn)為False
label:控制圖像中的圖例標(biāo)簽顯示內(nèi)容
使用默認(rèn)參數(shù)進(jìn)行繪制:
ax?=?sns.distplot(iris.petal_length)

修改所有對(duì)象的顏色,繪制rugplot部分,并修改bins為20:
ax?=?sns.distplot(iris.petal_length,color='r',
?????????????????rug=True,
?????????????????bins=20)

在上圖的基礎(chǔ)上強(qiáng)行擬合卡方分布并利用參數(shù)字典設(shè)置fit曲線為綠色:
from?scipy.stats?import?chi2????????????????
ax?=?sns.distplot(iris.petal_length,color='r',
?????????????????rug=True,
?????????????????bins=20,
?????????????????fit=chi2,
?????????????????fit_kws={'color':'g'})

修改norm_hist參數(shù)為False使得縱軸顯示的不再是密度而是頻數(shù)(注意這里必須關(guān)閉kde和fit繪圖的部分,否則縱軸依然顯示密度),利用hist_kws傳入字典調(diào)整直方圖部分色彩和透明度,利用rug_kws傳入字典調(diào)整rugplot部分小短條色彩:
ax?=?sns.distplot(iris.petal_length,color='r',
?????????????????rug=True,
?????????????????kde=False,
?????????????????bins=20,
?????????????????fit=None,
?????????????????hist_kws={'alpha':0.6,'color':'orange'},
?????????????????rug_kws={'color':'g'},
?????????????????norm_hist=False)

五、jointplot
之所以按照kdeplot-rugplot-distplot的順序來(lái)介紹是因?yàn)閐istplot中涉及到kdeplot與rugplot中的相關(guān)內(nèi)容,而本文最后要介紹的函數(shù)jointplot中聚合了前面所涉及到的眾多內(nèi)容,用于對(duì)成對(duì)變量的相關(guān)情況、聯(lián)合分布以及各自的分布在一張圖上集中呈現(xiàn),其主要參數(shù)如下:
x,y:代表待分析的成對(duì)變量,有兩種模式,第一種模式:在參數(shù)data傳入數(shù)據(jù)框時(shí),x、y均傳入字符串,指代數(shù)據(jù)框中的變量名;第二種模式:在參數(shù)data為None時(shí),x、y直接傳入兩個(gè)一維數(shù)組,不依賴數(shù)據(jù)框
data:與上一段中的說(shuō)明相對(duì)應(yīng),代表數(shù)據(jù)框,默認(rèn)為None
kind:字符型變量,用于控制展示成對(duì)變量相關(guān)情況的主圖中的樣式
color:控制圖像中對(duì)象的色彩
height:控制圖像為正方形時(shí)的邊長(zhǎng)
ratio:int型,調(diào)節(jié)聯(lián)合圖與邊緣圖的相對(duì)比例,越大則邊緣圖越矮,默認(rèn)為5
space:int型,用于控制聯(lián)合圖與邊緣圖的空白大小
xlim,ylim:設(shè)置x軸與y軸顯示范圍
joint_kws,marginal_kws,annot_kws:傳入?yún)?shù)字典來(lái)分別精細(xì)化控制每個(gè)組件
在默認(rèn)參數(shù)設(shè)置下繪制成對(duì)變量聯(lián)合圖:
ax?=?sns.jointplot(x='sepal_length',y='sepal_width',data=setosa)

值得一提的是,jointplot還貼心的在圖像上說(shuō)明了成對(duì)變量之間的皮爾遜簡(jiǎn)單相關(guān)系數(shù)以及相關(guān)性檢驗(yàn)的p值結(jié)果。
將kind參數(shù)設(shè)置為'reg',為聯(lián)合圖添加線性回歸擬合直線與核密度估計(jì)結(jié)果:
ax?=?sns.jointplot(x='sepal_length',y='sepal_width',data=setosa,
??????????????????kind='reg')

修改kind為'hex'來(lái)為聯(lián)合圖生成六邊形核密度估計(jì):
ax?=?sns.jointplot(x='sepal_length',y='sepal_width',data=setosa,
??????????????????kind='hex')

修改kind為'kde'來(lái)將直方圖和散點(diǎn)圖轉(zhuǎn)換為核密度估計(jì)圖,并將邊際軸的留白大小設(shè)定為0:
ax?=?sns.jointplot(x='sepal_length',y='sepal_width',data=setosa,
???????????????????kind='kde',
???????????????????space=0,
???????????????????color='g')

jointplot還支持圖層疊加,如下面的例子,我們首先繪制出的聯(lián)合圖中kind限制為擬合線性回歸直線,在此基礎(chǔ)上利用.plot_joint方法疊加核密度估計(jì)圖層:
ax?=?(sns.jointplot(x='sepal_length',y='sepal_width',data=setosa,
???????????????????color='g',
???????????????????kind='reg')).plot_joint(sns.kdeplot,?zorder=0,?n_levels=10)

根據(jù)你的具體需要還可以疊加出更加豐富的圖像。
調(diào)大ratio參數(shù)使得邊緣圖更加小巧:
ax?=?sns.jointplot(x='sepal_length',y='sepal_width',data=setosa,
???????????????????kind='kde',
???????????????????space=0,
???????????????????color='g',
???????????????????ratio=15)

利用邊緣圖形參數(shù)字典為邊緣圖形添加rugplot的內(nèi)容,并修改直方個(gè)數(shù)為15:
ax?=?sns.jointplot(x='sepal_length',y='sepal_width',data=setosa,
???????????????????marginal_kws=dict(bins=15,?rug=True),
???????????????????linewidth=1,space=0)

實(shí)際上,如果你足夠了解matplotlib與seaborn,可以通過(guò)各種組合得到信息量更豐富特別的圖像!
以上就是本文的全部?jī)?nèi)容,如有筆誤望指出!
添加微信號(hào)"CNFeffery"加入技術(shù)交流群
Python大數(shù)據(jù)分析
data creates?value
掃碼關(guān)注我們
