seaborn 数据可视化(一)连续型变量可视化
一.綜述
Seaborn其實(shí)是在matplotlib的基礎(chǔ)上進(jìn)行了更高級(jí)的API封裝,從而使得作圖更加容易,圖像也更加美觀,本文基于seaborn官方API還有自己的一些理解。
1.1.樣式控制:axes_style() and set_style()
seaborn提供了5個(gè)主題:
darkgrid 黑色網(wǎng)格(默認(rèn))
whitegrid 白色網(wǎng)格
dark 黑色背景
white 白色背景
ticks 帶刻度線
一個(gè)簡(jiǎn)單的小例子:
import numpy as np
sns.set_style("darkgrid")
def cosplot(flip=1): #余弦偏移 x = np.linspace(0,14,100) for i in range(1,7): plt.plot(x,np.cos(x+i*.5)*(7-i)*flip) cosplot() # 默認(rèn)無(wú)參數(shù)狀態(tài),就是刪除上方和右方的邊框 sns.despine()
1.2 .color_palette()創(chuàng)建調(diào)色板
1.2.1 .分類(lèi)調(diào)色板——分類(lèi)色板(定性)是在區(qū)分沒(méi)有固定順序的數(shù)據(jù)時(shí)最好的選擇
current_palette = sns.color_palette() sns.palplot(current_palette)
默認(rèn)顏色主題共有六種不同的變化分別是:deep, muted, pastel, bright, dark, 和 colorblind。
current=sns.color_palette('dark')
sns.palplot(current)
二.連續(xù)型單變量的數(shù)據(jù)可視化
在單變量為分類(lèi)變量的時(shí)候,數(shù)據(jù)的分析會(huì)相對(duì)簡(jiǎn)單,可以通過(guò)非常簡(jiǎn)單的sum,mean等統(tǒng)計(jì)變量直接查看自己需要的統(tǒng)計(jì)信息基本就能滿足我們的需求,非常簡(jiǎn)單,并不會(huì)給我們帶來(lái)非常大的困難,但是如果單變量為連續(xù)變量的時(shí)候,數(shù)據(jù)的可視化就較為重要.
一般最常見(jiàn)的對(duì)連續(xù)單變量特征進(jìn)行分析的情況會(huì)出現(xiàn)在回歸等問(wèn)題中,這個(gè)時(shí)候通過(guò)可視化的方式可以很快地讓我們了解到數(shù)據(jù)的分布情況以及是否有奇異值的情況.這對(duì)我們數(shù)據(jù)的處理能帶來(lái)極大的方便.
常用的函數(shù):hist、kdeplot、distplot
首先導(dǎo)入所需要的包
import numpy as np
import pandas as pd
import warnings
from scipy import stats,integrate
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore') #忽略了警告錯(cuò)誤的輸出
import seaborn as sns
sns.set_style("darkgrid")
sns.set(color_codes=True) #set( )設(shè)置主題,調(diào)色板更常用
np.random.seed(sum(map(ord, "distributions")))
ord()函數(shù)它以一個(gè)字符(長(zhǎng)度為1的字符串)作為參數(shù),返回對(duì)應(yīng)的ASCII數(shù)值,或者Unicode數(shù)值.
如果所給的Unicode字符超出了你的Python定義范圍,則會(huì)引發(fā)一個(gè)TypeError的異常.
利用np.random.seed()函數(shù)設(shè)置相同的seed,每次生成的隨機(jī)數(shù)相同。如果不設(shè)置seed,則每次會(huì)生成不同的隨機(jī)數(shù).
2.1.hist
繪制直方圖的方法在matplotlib中,這個(gè)方法可以直觀地讓我們了解到散落在各個(gè)區(qū)間的數(shù)據(jù)的情況(數(shù)據(jù)分布),hist默認(rèn)為10個(gè)bins.
x=np.random.normal(size=100) plt.hist(x)
2.2.kdeplot
對(duì)于連續(xù)的變量,光看直方圖肯定是不夠的,數(shù)據(jù)的分布的觀察也是必不可少的,這時(shí)我們需要借用KDE(Kernel Density Estimate)函數(shù)
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
Parameters:
a : Series, 1d-array, or list. #一維數(shù)組
bins : argument for matplotlib hist(), or None, optional #設(shè)置分桶數(shù)
hist : bool, optional #控制是否顯示分桶柱子
kde : bool, optional #控制是否顯示核密度估計(jì)圖
rug : bool, optional #控制是否顯示觀測(cè)實(shí)例豎線
fit : random variable object, optional #控制擬合的參數(shù)分布圖形
{hist, kde, rug, fit}_kws : dictionaries, optional
Keyword arguments for underlying plotting functions.
vertical : bool, optional #顯示正交控制
If True, oberved values are on y-axis.
sns.kdeplot(x,shade=True)
KDE的帶寬bandwidth(bw)參數(shù)控制估計(jì)對(duì)數(shù)據(jù)的擬合程度,與直方圖中的bin(數(shù)據(jù)切分?jǐn)?shù)量參數(shù))大小非常相似。 它對(duì)應(yīng)于我們上面繪制的內(nèi)核的寬度。
sns.kdeplot(x)
sns.kdeplot(x, bw=.2, label="bw: 0.2")
sns.kdeplot(x, bw=2, label="bw: 2")
plt.legend();
2.3.displot
上面的兩個(gè)函數(shù)非常實(shí)用,但是還有一個(gè)非常好的函數(shù),distplot 函數(shù),該函數(shù)包含了絕大多數(shù)單變量可視化的能力,可以直接使用distplot實(shí)現(xiàn)上面兩個(gè)函數(shù)的功能,此外它還可以繪制出其他的近似分布.
默認(rèn)的distplot能直接繪制出我們需要的直方圖以及對(duì)應(yīng)的核密度估計(jì)(KDE).
sns.distplot(x)
當(dāng)然如果不想看到kde曲線,我們可以直接將kde去掉,如果只想看kde曲線,我們也可以把直方圖去掉.
繪制kde曲線一般會(huì)比較耗時(shí),所以可以直接將kde設(shè)置為False
sns.distplot(x,kde=False,rug=True)
當(dāng)然也可以將直方圖省去.僅看kde曲線
sns.distplot(x,hist=False,rug=True)
此外,distplot可以繪制很多分布,函數(shù)內(nèi)部涵蓋了大量的分布函數(shù),可以用來(lái)近似擬合數(shù)據(jù).這對(duì)于熟悉統(tǒng)計(jì)的人來(lái)說(shuō)十分有用.例如gamma函數(shù)等等.
y=np.random.gamma(6,size=200) sns.distplot(y,bins=20,rug=True) sns.distplot(y,bins=20,kde=False,rug=True,fit=stats.gamma)
二.連續(xù)(continious)的二元變量特征的數(shù)據(jù)可視化
上面的數(shù)據(jù)可視化是基于單變量的,常常用于對(duì)連續(xù)形式的label(回歸問(wèn)題中較為常見(jiàn))進(jìn)行觀察處理.實(shí)際問(wèn)題中我們不會(huì)僅僅只對(duì)數(shù)據(jù)進(jìn)行觀察,還需要進(jìn)行預(yù)測(cè)等,自然而然的,數(shù)據(jù)之間關(guān)系的分析就顯得非常重要.此處我們開(kāi)始對(duì)數(shù)據(jù)之間的關(guān)系進(jìn)行分析,主要是兩個(gè)連續(xù)變量之間的相關(guān)性分析.關(guān)于涉及分類(lèi)變量的部分我們會(huì)在第后續(xù)分進(jìn)行介紹.
這一節(jié)主要介紹如下幾個(gè)函數(shù)matplotlib.pyplot中的scatterplot函數(shù)以及seaborn中的jointplot函數(shù).
用多元高斯分布函數(shù)生成兩個(gè)變量x,y.
mean,cov=[0,1],([0.5,1],(1,0.5)) data=np.random.multivariate_normal(mean,cov,size=200) df=pd.DataFrame(data,columns=['x','y']) df.head()
2.1.Scatterplot函數(shù)
這個(gè)函數(shù)是通用的,尤其是兩個(gè)變量都是連續(xù)型變量的時(shí)候,我們希望看看在二維平面上二者之間的關(guān)系時(shí)必然會(huì)先想到散點(diǎn)圖函數(shù),當(dāng)然當(dāng)數(shù)據(jù)比較多的時(shí)候,建議采樣觀察[,不然真的很耗時(shí).
通過(guò)Scatterplot我們可以很容易的發(fā)現(xiàn)一些數(shù)據(jù)的分布規(guī)律,是否有簇的存在等等,在涉及類(lèi)似于經(jīng)緯度的問(wèn)題時(shí),我們經(jīng)常會(huì)通過(guò)scatterplot看數(shù)據(jù),然后考慮聚類(lèi)等操作.
plt.scatter(df['x'].values,df['y'].values)
2.2.Jointplot函數(shù)
Scatterplot函數(shù)是非常實(shí)用的,但是用過(guò)seaborn的伙伴肯定都還會(huì)知道joinplot這個(gè)函數(shù),不僅能方便的繪制散點(diǎn)圖,同時(shí)還融入了很多其他功能,還可以幫我們直接進(jìn)行一些簡(jiǎn)單的模型的擬合(linear regression,etc)
joinplot這個(gè)函數(shù)顯示兩個(gè)變量之間的雙變量(或聯(lián)合)關(guān)系以及每個(gè)變量的單變量(或邊際)分布和軸。
還可以在圖像加回歸擬合直線
sns.jointplot(x='x',y='y',data=df,kind='reg')
Hexbin繪圖和KDE繪圖,這兩個(gè)繪圖大致可以更加直觀的炫酷的看出數(shù)據(jù)的一個(gè)分布情況(例如hex圖,越白的地方數(shù)據(jù)就越少,基本都沒(méi)有數(shù)據(jù)在那里).
因?yàn)樗@示了落在六邊形倉(cāng)內(nèi)的觀測(cè)數(shù)。該圖適用于較大的數(shù)據(jù)集。通過(guò)matplotlib plt.hexbin函數(shù)和jointplot()中的樣式可以實(shí)現(xiàn)。
sns.jointplot(x="x", y="y", data=df,kind ='hex' );
使用白色背景效果:
with sns.axes_style("white"):
sns.jointplot(x=x, y=y, kind="hex", color="k");
在seaborn中,這種圖用等高線圖顯示,可以在jointplot()中作為樣式傳入?yún)?shù)使用:
sns.jointplot(x="x", y="y", data=df, kind="kde");
還可以使用kdeplot()函數(shù)繪制二維核密度圖:
f, ax = plt.subplots(figsize=(6, 6)) sns.kdeplot(df.x, df.y, ax=ax) sns.rugplot(df.x, color="g", ax=ax) sns.rugplot(df.y, vertical=True, ax=ax);
連續(xù)地顯示雙變量密度,可以簡(jiǎn)單地增加n_levels參數(shù)增加輪廓級(jí)數(shù):
f, ax = plt.subplots(figsize=(6, 6)) cmap = sns.cubehelix_palette(as_cmap=True, dark=0, light=1, reverse=True) sns.kdeplot(df.x, df.y, cmap=cmap, n_levels=60, shade=True);
plot_joint函數(shù),該繪圖函數(shù)可以將很多繪圖形式放在同一張圖表中,更加豐富我們的視圖.
g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")
g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$X$", "$Y$");
2.3.pairplot函數(shù)
該函數(shù)會(huì)同時(shí)繪制數(shù)據(jù)中所有特征兩兩之間的關(guān)系圖.因?yàn)閜airplot是建立在pairgrid之上,所以可以將中間的很多函數(shù)進(jìn)行變換,例如下面的kde的例子.
默認(rèn)對(duì)角線histgram,非對(duì)角線kdeplot
iris=sns.load_dataset('iris') #導(dǎo)入經(jīng)典的鳶尾花數(shù)據(jù)
sns.pairplot(iris);
對(duì)于jointplot()和JointGrid之間的關(guān)系,pairplot()函數(shù)是建立在一個(gè)PairGrid對(duì)象上的,可以直接使用它來(lái)獲得更大的靈活性:
g = sns.PairGrid(iris) g.map_diag(sns.kdeplot) g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6);
g = sns.PairGrid(iris) g.map_diag(sns.kdeplot) g.map_offdiag(sns.kdeplot);
參考:
https://zhuanlan.zhihu.com/p/27471537
https://blog.csdn.net/qq_34264472/article/details/53814653
https://blog.csdn.net/cymy001/article/details/78418432
https://www.kesci.com/apps/home/project/59f687e1c5f3f511952baca0
總結(jié)
以上是生活随笔為你收集整理的seaborn 数据可视化(一)连续型变量可视化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++实现双人枪战游戏
- 下一篇: WIN10 拨号连接下 如何开启移动热点