一、seaborn介紹
seaborn是python中基於Matplotlib包具有更多可視化效果和更多風格的可視化模塊,可以說是Matplotlib的封裝。當我們想要探索單個或者一對數據分布上的特征時,可以使用seaborn中內置的若干函數對數據的分布進行多種多樣的可視化。
二、kdeplot
對於單變量和雙變量進行核密度估計,並可視化,參數表如下:
參數 | 說明 |
data | 一維數組,單變量時作為唯一的量 |
data2 | 格式同data,單變量時不輸入,雙變量是作為第2個輸入變量 |
shade | bool型,是否對核密度估計曲線下的面積進行色彩填充,默認為False |
vertical | bool型,是否顛倒x-y軸位置(單變量輸入時有效) |
kernel | 字符型,核密度估計的方法,默認為‘gau’,即高斯核,且在2維變量的情況下僅支持高斯核方法 |
legend | bool型,是否在圖像上添加圖例 |
cumulative | bool型,是否繪制核密度密度估計的累計分布,默認為False |
shade_lowest | bool型,是否為核密度估計中最低的范圍着色,主要用於在同一個坐標軸中比較多個不同分布總體,默認為True |
cbar |
bool型,是否在繪制二維核密度估計圖時在圖像右側添加比色卡 |
color | 字符型,控制核密度曲線的色彩,plt.plot()中的color參數 |
cmap | 字符型,核密度區域的遞進色彩方案,同plt.plot()中的cmap參數,如'Blues'代表藍色系 |
n_levels | int型,控制核密度區間的個數,反映在圖像上的閉環層數 |
import numpy as np import seaborn as sns import matplotlib.pyplot as plt sns.set(color_codes = True) %matplotlib inline mean = [0,2] cov = [(1,0.5),(0.5,1)] x,y = np.random.multivariate_normal(mean,cov,50).T
numpy.random.multivariate_normal()函數解析
1、不修改其他參數只傳入數據,繪制
#單變量 ax = sns.kdeplot(x)
2、加入紅的填充區域並添加圖例
# ax = sns.kdeplot(x,shade = True,color='r',legend=True) ax = sns.kdeplot(x,shade=True,label='x')
3、修改為核密度估計的累計分布
ax = sns.kdeplot(x,shade=True,color='r',cumulative=True)
4、交換x-y軸位置
ax = sns.kdeplot(x,shade = True,color='r',vertical = True)
5、繪制雙變量聯合密度估計圖
ax = sns.kdeplot(x,y)
6、修改調色方案,並設置shade_lowest = True、陰影填充及核密度區間個數
ax = sns.kdeplot(x,y,cmap='Blues',shade = True,shade_lowest=True) ax = sns.kdeplot(x,y,cmap='Blues',shade = True,shade_lowest=True,n_levels=5)
7、在同一個子圖中繪制兩個不同一維總體的核密度估計圖
ax1 = sns.kdeplot(x,label='x',shade = True,color='r') ax2 = sns.kdeplot(y,label='y',shade = True,color='y')
8、在同一個子圖中繪制兩個不同二維總體的核密度估計圖
mean1 = [-1,1] cov1 = [(0,0.3),(0.3,0.1)] x1,y1 = np.random.multivariate_normal(mean1,cov1,30).T ax1 = sns.kdeplot(x,y,cmap='Reds',shade=True,shade_lowest=False) ax2 = sns.kdeplot(x1,y1,cmap='Greens',shade=True,shade_lowest=False)
三、rugplot
用於繪制出一維數組中數據點實際的分布位置情況,即不添加任何數學意義上的擬合,只是單純的記錄值在坐標軸上進行展示,相當於kdeplot,可以展示出數據的離散分布情況。參數表如下:
參數 | 說明 |
a | 一維數組,傳入觀測值向量 |
height | 設置每個觀測點對應的小短條的高度,默認為0.05 |
axis | 字符型變量,觀測值對應小短條所在的軸,默認為'x',即x軸 |
1、使用默認參數進行繪制
ax = sns.rugplot(x)
2、調換小短條所處的坐標軸並修改其高度與顏色
ax = sns.rugplot(x,axis='y',height = 0.3,color='y')
四、displot
displot主要功能是繪制單變量的直方圖,而且可以在直方圖的基礎之上加上kdeplot和rugplot的部分內容,其功能非常強大,其主要參數如下:
參數 | 說明 |
a | 以為數組形式,傳入帶分析的變量 |
bins | int型變量,確定直方圖中限制直方的數量,默認為None |
hist | bool型,是描繪制直方圖,默認為True |
kde | bool型,是否繪制核密度估計曲線,默認為True |
rug | bool型,是否繪制對應的rugplot部分,默認為False |
fit | 傳入scipy_stats中的分布類型,用於觀察變量上抽取相關統計特征來強行擬合的分布,默認為None,即不進行擬合 |
hist_kws |
字典形式的輸入,對應hist原生函數中的參數名稱與參數值 |
kde_kws | 同上 |
rug_kws | 同上 |
color | 控制除了fit部分擬合出的曲線之外的所有對象的色彩 |
vertical | bool型,是否顛倒x-y軸,默認為False |
norm_hist | bool型,表示直方圖高度代表的意義,默認為False True:直方圖高度表示對應的密度 False:對應的直方區間內記錄值個數 |
label | 控制圖像中的圖例標簽顯示內容 |
1、使用默認參數進行繪制
import pandas as pd x = pd.Series(x,name = 'x') ax = sns.distplot(x)
2、修改所有對象顏色,繪制rugplot部分,並修改bins
ax = sns.distplot(x,color='r',rug=True,bins=20)
3、強行擬合卡方分布並利用參數字典設置fit曲線顏色
ax = sns.distplot(x,color='r',rug=True,bins=20,kde=False,fit=None, norm_hist=False,hist_kws={'alpha':0.6,'color':'orange'}, rug_kws={'color':'g'})
4、修改norm_hist參數為False使得縱軸顯示的不再是密度而是頻數(注意這里必須關閉kde和fit繪圖的部分,否則縱軸依然顯示密度),利用hist_kws傳入字典調整直方圖部分色彩和透明度,利用rug_kws傳入字典調整rugplot部分小短條色彩:
五、jointplot
jointplot中聚合了kdeplot和rugplot中的相關內容,故放於最后進行介紹;
jointplot主要用於對成對變量的相關情況、聯合分布及各自的分布呈現於一張圖表,jointplot的主要參數如下:
參數 | 說明 |
x,y | 代表待分析的成對變量,有兩種模式; 第一種模式:在參數data傳入數據框時,x、y均傳入字符串,指代數據框中的變量名; 第二種模式:在參數data為None時,x、y直接傳入兩個一維數組,不依賴數據框 |
data | 與上一段中的說明相對應,代表數據框,默認為None |
kind | 字符型,展示成對變量相關情況的主圖中的樣式 |
color | 圖像中對象的色彩 |
height | 圖像為正方形時的邊長 |
ratio | int型,調節聯合圖與邊緣圖的相對比例,越大則邊緣圖越矮,默認為5 |
space | int型,用於控制聯合圖與邊緣圖的空白大小 |
xlim,ylim | 設置x軸與y軸顯示范圍 |
joint_kws, marginal_kws, annot_kws |
傳入參數字典來分別精細化控制每個組件 |
1、使用默認參數繪制成對變量聯合圖
模式一:在參數data傳入數據框時,x、y均傳入字符串,指代數據框中的變量名
data = pd.DataFrame() data['x']=x data['y']=y ax = sns.jointplot(x='x',y='y',data=data)
模式二:在參數data為None時,x、y直接傳入兩個一維數組,不依賴數據框
y = pd.Series(y,name='y') ax = sns.jointplot(x=x,y=y)
2、將kind參數設置為‘reg’,為聯合圖添加線性回歸擬合直線與核密度估計結果
y = pd.Series(y,name='y') ax = sns.jointplot(x=x,y=y,kind='reg')
3、將kind參數設置為‘hex’,生成六邊形核密度估計聯合圖
y = pd.Series(y,name='y') ax = sns.jointplot(x=x,y=y,kind='hex')
4、將kind參數設置為‘kde’,將直方圖和散點圖轉換為核密度估計圖,並將邊際軸的留白大小設定為0
y = pd.Series(y,name='y') ax = sns.jointplot(x=x,y=y,kind='kde',space=0)
5、利用邊緣圖形參數字典為邊緣圖形添加rugplot的內容,並修改直方個數為15
ax = sns.jointplot(x=x,y=y,color='g',kind='reg',marginal_kws={'bins':15,'rug':True})
6、jointplot支持圖層疊加
例:我們首先繪制出的聯合圖中kind限制為擬合線性回歸直線,在此基礎上利用.plot_joint方法疊加核密度估計圖層:
ax = sns.jointplot(x=x,y=y,color='g',kind='reg').plot_joint(sns.kdeplot,n_levels=5)