哈嘍,大家好。
今天詳解 Seaborn,它基于 Matplotlib,用來(lái)制作統(tǒng)計(jì)圖形的 Python 庫(kù)。
Seaborn 的優(yōu)勢(shì):
我整理了一份 seaborn 核心知識(shí)點(diǎn)的思維導(dǎo)圖
需要的朋友文末回復(fù)關(guān)鍵詞獲取。
下面我們就來(lái)學(xué)習(xí)一下這個(gè)強(qiáng)大的 Searborn 。
多變量關(guān)系圖其實(shí)就是二維散點(diǎn)圖和線圖,可以通過(guò)這些函數(shù)來(lái)繪制:relplot()
、scatterplot()
和lineplot()
。
scatterplot()
只能繪制散點(diǎn)圖,lineplot()
只能繪制線圖。
relplot()
都可以繪制,通過(guò)kind
參數(shù)來(lái)區(qū)分:
kind='scatter'(默認(rèn))
等價(jià)于scatterplot()
kind='line'
等價(jià)于lineplot()
在 seaborn 中,定義一個(gè)通用函數(shù)并用kind
參數(shù)指定需要繪制的圖形,這種形式很常見(jiàn)。這樣做法的好處在于,調(diào)用一個(gè)函數(shù)便可以繪制多種圖形。
繪制散點(diǎn)圖
import seaborn as sns
import pandas as pd
import numpy as np
sns.set_theme(style='darkgrid')
tips = sns.load_dataset('tips', data_home='seaborn-data', cache=True)
sns.relplot(x='total_bill', y='tip', data=tips);
繪制線圖
df = pd.DataFrame({'a': range(10), 'b': np.random.randn(10)})
sns.relplot(x='a', y='b', kind='line', data=df)
seaborn 可以直接讀取 pandas DataFrame
中的列作為x
軸和y
軸,一行代碼即可完成繪圖,使用比 matplotlib 更容易。
relplot()
函數(shù)中有一些常用的參數(shù),可以幫助我們繪制更復(fù)雜的圖形。
以上面散點(diǎn)圖為例,設(shè)置hue
參數(shù),可以為不同類(lèi)別的點(diǎn)繪制不同的顏色。
sns.relplot(x='total_bill', y='tip', hue='smoker', data=tips);
smoker
是tips
中的一列,取值為Yes
和No
,上面散點(diǎn)圖中smoker=Yes
時(shí)點(diǎn)是藍(lán)色,smoker=No
時(shí),點(diǎn)是橙色。
設(shè)置col
參數(shù),可以將數(shù)據(jù)繪制不同的散點(diǎn)圖中
sns.relplot(x='total_bill', y='tip', col='smoker', data=tips);
smoker=Yes
的數(shù)據(jù)都繪制在第1行第1列的散點(diǎn)圖中;smoker=No
的數(shù)據(jù)都繪制在第1行第2列的散點(diǎn)圖中。
設(shè)置style
參數(shù),可以為不同類(lèi)別的點(diǎn)繪制不同的形狀。
sns.relplot(x='total_bill', y='tip', style='smoker', data=tips);
smoker=Yes
的是圓點(diǎn);smoker=No
是星號(hào)。
下圖列舉了replot
的其他的參數(shù),使用方式與上面類(lèi)似,這里就不再贅述了。
這些參數(shù)對(duì)線圖也同樣適用,并且參數(shù)之間可以任意組合。
上面繪制的線圖,橫坐標(biāo)x
取值是唯一的,但實(shí)際中有些數(shù)據(jù)橫坐標(biāo)取值不唯一,用relplot()
繪制出來(lái)是下面的效果。
fmri = sns.load_dataset('fmri', data_home='seaborn-data', cache=True)
sns.relplot(x='timepoint', y='signal', kind='line', data=fmri);
藍(lán)色實(shí)線是x
的平均值,周?chē)年幱笆瞧骄档?95% 置信區(qū)間。
周?chē)幱翱梢酝ㄟ^(guò)ci
參數(shù)設(shè)置,如:ci='sd'
表示繪制標(biāo)準(zhǔn)差,而不是置信區(qū)間。
sns.relplot(x='timepoint', y='signal', kind='line', ci='sd', data=fmri);
ci=None
可以不顯示陰影。
設(shè)置estimator=None
參數(shù)可以關(guān)閉聚合
sns.relplot(x='timepoint', y='signal', estimator=None, kind='line', data=fmri);
seaborn 提供 histplot()
,kdeplot()
,ecdfplot()
和rugplot()
函數(shù),分別繪制直方圖、核密度估計(jì)圖、經(jīng)驗(yàn)累積分布圖和垂直刻度。
分布圖的通用函數(shù)是displot()
,通過(guò)指定kind
來(lái)繪制不同的圖:
kind='hist'(默認(rèn))
等價(jià)于histplot()
kind='kde'
等價(jià)于kdeplot()
kind='ecdf'
等價(jià)于ecdfplot()
由于rugplot()
只是用來(lái)標(biāo)識(shí)刻度,它不需要kind
指定,而是通過(guò)rug=True
或rug=False(默認(rèn))
來(lái)指定是否需要顯示在圖形中。
直方圖是比較常見(jiàn)的數(shù)據(jù)分布圖,它的繪制也很簡(jiǎn)單。
sns.displot(penguins, x='flipper_length_mm')
seaborn 提供了binwidth
、bins
等參數(shù)設(shè)置直方圖 bin 的寬度和數(shù)量,從而繪制不同形狀的直方圖。
這里也可以設(shè)置hue
參數(shù),用不同顏色在一張圖里繪制不同類(lèi)別的直方圖。當(dāng)在一張圖里繪制多個(gè)直方圖時(shí),需要設(shè)置element
和multiple
參數(shù)來(lái)指定多個(gè)直方圖的組合方式。
如:multiple='stack'
代表堆疊顯示。
sns.displot(penguins, x='flipper_length_mm', hue='species', multiple='stack')
設(shè)置stat
參數(shù)可以歸一化直方圖。如:設(shè)置stat='probability'
可以使條形高度的和為1。
sns.displot(penguins, x='flipper_length_mm', hue='species', stat='probability')
以下是直方圖常見(jiàn)的參數(shù)及取值
直方圖的目的是通過(guò)分箱和計(jì)數(shù)觀察來(lái)近似生成數(shù)據(jù)的潛在概率密度函數(shù)。核密度估計(jì) (KDE) 是為這一問(wèn)題提供了不同的解決方案。
sns.displot(penguins, x='flipper_length_mm', kind='kde')
seaborn 從0.11.0
版本開(kāi)始只支持高斯核函數(shù)。
設(shè)置bw_adjust
參數(shù)可以讓 KDE 圖更平滑。
sns.displot(penguins, x='flipper_length_mm', kind='kde', bw_adjust=2)
設(shè)置kde=True
而不是kind='kde'
,可以同時(shí)繪制直方圖和 KDE 圖。
sns.displot(penguins, x='flipper_length_mm', kde=True)
經(jīng)驗(yàn)累積分布函數(shù)(ECDF) 通過(guò)每個(gè)數(shù)據(jù)點(diǎn)繪制了一條單調(diào)遞增的曲線,使得曲線的高度反映了具有較小值的觀測(cè)值的比例。
sns.displot(penguins, x='flipper_length_mm', hue='species', kind='ecdf')
之前繪制的都是單變量分布圖,seaborn 也可以繪制兩個(gè)變量的分布圖。
sns.displot(penguins, x='bill_length_mm', y='bill_depth_mm')
用平面圖來(lái)展示二元直方圖只能通過(guò)每個(gè)方塊的顏色深淺定性觀察數(shù)據(jù)的多少。
同樣的,也可以繪制二元核密度估計(jì)圖,畫(huà)出來(lái)的圖形是等高線。
sns.displot(penguins, x='bill_length_mm', y='bill_depth_mm', kind='kde')
設(shè)置fill=True
,可以通過(guò)顏色定性觀察面的高度。
seaborn 還提供了 jointplot()
函數(shù)為二元變量同時(shí)繪制不同圖形。
sns.jointplot(data=penguins, x='bill_length_mm', y='bill_depth_mm')
jointplot()
默認(rèn)繪制兩變量散點(diǎn)圖和單變量直方圖。
設(shè)置kind=kde
來(lái)繪制 KDE 圖。
sns.jointplot(
data=penguins,
x='bill_length_mm', y='bill_depth_mm', hue='species',
kind='kde'
)
seanborn 還提供了pairplot()
函數(shù),為更多變量繪圖。
sns.pairplot(penguins)
默認(rèn)繪圖仍然是直方圖和散點(diǎn)圖。同樣可以設(shè)置kind=kde
繪制多變量 KDE 圖。
之前我們繪制的關(guān)系圖都是數(shù)值變量,當(dāng)數(shù)據(jù)中有類(lèi)別數(shù)據(jù)(離散值)時(shí),就需要用分類(lèi)圖來(lái)繪制。
seaborn 提供 catplot()
函數(shù)來(lái)繪制分類(lèi)圖,有以下3種類(lèi)別
分類(lèi)散點(diǎn)圖
kind='strip'(默認(rèn))
等價(jià)于 stripplot()
kind='swarm'
等價(jià)于 swarmplot()
分類(lèi)分布圖
kind='box'
等價(jià)于 boxplot()
kind='violin'
等價(jià)于 violinplot()
kind='boxen'
等價(jià)于 boxenplot()
分類(lèi)估計(jì)圖
kind='point'
等價(jià)于 pointplot()
kind='bar'
等價(jià)于 barplot()
kind='count'
等價(jià)于 countplot()
catplot()
默認(rèn)使用stripplot()
繪圖,它會(huì)用少量隨機(jī)'抖動(dòng)'調(diào)整分類(lèi)軸上的點(diǎn)位置,避免所有的點(diǎn)都重疊在一起。
tips = sns.load_dataset('tips', data_home='seaborn-data', cache=True)
sns.catplot(x='day', y='total_bill', data=tips)
設(shè)置jitter
參數(shù)可以控制抖動(dòng)的幅度,當(dāng)jitter=False
時(shí),代表不抖動(dòng),繪制出的圖形跟使用關(guān)系散點(diǎn)圖是一樣的。
sns.catplot(x='day', y='total_bill', jitter=False, data=tips)
等價(jià)于
sns.relplot(x='day', y='total_bill', data=tips)
可以看到,圖上的xy坐標(biāo)相同的數(shù)據(jù)重合在一起,非常不方便觀察。
雖然jitter
可以設(shè)置“抖動(dòng)”,但也有可能造成數(shù)據(jù)重疊。而kind='swarm'
可以繪制非重疊的分類(lèi)散點(diǎn)圖。
sns.catplot(x='day', y='total_bill', kind='swarm', data=tips)
kind='box'
可以繪制箱線圖。
sns.catplot(x='day', y='total_bill', kind='box', data=tips)
kind='boxen'
可以繪制增強(qiáng)箱線圖。
diamonds = sns.load_dataset('diamonds', data_home='seaborn-data', cache=True)
sns.catplot(x='color', y='price', kind='boxen', data=diamonds.sort_values('color'))
kind='violin'
可以繪制小提琴圖。
sns.catplot(x='day', y='total_bill', hue='sex', kind='violin', split=True, data=tips)
kind='bar'
以矩形條的方式展示數(shù)據(jù)點(diǎn)估值(默認(rèn)取平均值)和置信區(qū)間,該置信區(qū)間使用誤差線繪制。
titanic = sns.load_dataset('titanic', data_home='seaborn-data', cache=True)
sns.catplot(x='sex', y='survived', hue='class', kind='bar', data=titanic)
矩形條的高度是survived
列均值,上面的那根天線就是誤差線。
kind='count'
是常見(jiàn)的柱狀圖,統(tǒng)計(jì)x坐標(biāo)對(duì)應(yīng)的數(shù)據(jù)量。
sns.catplot(x='deck', kind='count', data=titanic)
kind='point'
繪制點(diǎn)圖,展示數(shù)據(jù)點(diǎn)的估計(jì)值(默認(rèn)平均值)和置信區(qū)間,并連接來(lái)自同一hue
類(lèi)別的點(diǎn)。
sns.catplot(x='sex', y='survived', hue='class', kind='point', data=titanic)
seaborn 提供線性回歸函數(shù)對(duì)數(shù)據(jù)擬合,包括regplot()
和lmplot()
,它倆大部分功能是一樣的,只是輸入的數(shù)據(jù)和輸出圖形稍有不同。
用lmplot()
函數(shù)可以繪制兩個(gè)變量x、y的散點(diǎn)圖,擬合回歸模型并繪制回歸線和該回歸的 95% 置信區(qū)間。
tips = sns.load_dataset('tips')
sns.lmplot(x='total_bill', y='tip', data=tips);
設(shè)置order
參數(shù)可以擬合多項(xiàng)式回歸模型
anscombe = sns.load_dataset('anscombe', data_home='seaborn-data', cache=True)
sns.lmplot(x='x', y='y', data=anscombe.query('dataset == 'II''), order=2);
設(shè)置logistic=True
參數(shù)可以擬合邏輯回歸模型
sns.lmplot(x='total_bill', y='big_tip', data=tips, logistic=True, y_jitter=.03);
seaborn 提供了FacetGrid
類(lèi)可以同時(shí)繪制多圖。
g = sns.FacetGrid(tips, row='sex', col='smoker')
g.map(sns.scatterplot, 'total_bill', 'tip')
實(shí)際上它等價(jià)于下面這段代碼
sns.relplot(x='total_bill', y='tip', row='sex', col='smoker', data=tips)
當(dāng)然用FaceGrid
的好處是可以像 matplotlib 那樣設(shè)置很多圖形屬性。
g = sns.FacetGrid(tips, row='sex', col='smoker')
g.map(sns.scatterplot, 'total_bill', 'tip')
g.set_axis_labels('Total bill', 'Tip')
g.set(xticks=[10, 30, 50], yticks=[2, 6, 10])
g.figure.subplots_adjust(wspace=.02, hspace=.02)
另外,seaborn 還提供了PairGrid
,可以為多變量同時(shí)繪圖,且圖形種類(lèi)可以不同。
iris = sns.load_dataset('iris', data_home='seaborn-data', cache=True)
g = sns.PairGrid(iris)
g.map_upper(sns.scatterplot)
g.map_lower(sns.kdeplot)
g.map_diag(sns.kdeplot, lw=3, legend=False)
上圖中,對(duì)角線以及對(duì)角線下方是 KDE 圖,對(duì)角線上方是散點(diǎn)圖。
這部分主要是對(duì)圖表外觀的設(shè)置,感興趣的朋友可以自行嘗試。
聯(lián)系客服