這是本學(xué)期在大數(shù)據(jù)哲學(xué)與社會(huì)科學(xué)實(shí)驗(yàn)室做的第八次分享了。
第一次分享的是:
第二次分享的是:
第三次分享的是:
第四次分享的是:
第五次分享的是:
第六次分享的是:
第七次分享的是:
本次分享的是“如何利用Seaborn繪制熱力圖?”
Seaborn是在matplotlib的基礎(chǔ)上進(jìn)行了更高級(jí)的API封裝,使得作圖更加容易,不需要經(jīng)過(guò)大量的調(diào)整就能使你的圖變得精致。
Seaborn官網(wǎng):
https://seaborn.pydata.org/
Seaborn安裝:
pip install seaborn
Seaborn升級(jí):
pip install --upgrade seaborn
顯示Seaborn信息:
pip show Seaborn
Name: seaborn
Version: 0.11.1
Summary: seaborn: statistical data visualization
Home-page: https://seaborn.pydata.org
Author: Michael Waskom
Author-email: mwaskom@nyu.edu
License: BSD (3-clause)
Location: c:\programdata\anaconda3\lib\site-packages
Requires: numpy, scipy, matplotlib, pandas
Required-by:
(base) PS D:\Users\Administrator>
熱力圖 就是用顏色深淺來(lái)表示數(shù)值大小的圖像。
在實(shí)際中常用于展示列聯(lián)表的數(shù)據(jù)分布,以及展示一組變量的相關(guān)系數(shù)矩陣,通過(guò)熱力圖我們可以非常直觀地感受到數(shù)值大小的差異狀況。
heatmap的API如下所示:
def heatmap(
data, *,
vmin=None, vmax=None, cmap=None, center=None, robust=False,
annot=None, fmt=".2g", annot_kws=None,
linewidths=0, linecolor="white",
cbar=True, cbar_kws=None, cbar_ax=None,
square=False, xticklabels="auto", yticklabels="auto",
mask=None, ax=None,
**kwargs
):
列聯(lián)表是根據(jù)多個(gè)類別變量來(lái)對(duì)觀測(cè)值進(jìn)行計(jì)數(shù)的表。該表的行和列對(duì)應(yīng)于這些類別變量。
本案例采用的數(shù)據(jù)集是Seaborn中內(nèi)置的flights航班數(shù)據(jù)集,dataframe中的數(shù)據(jù)代表了1949年-1960年每個(gè)月的航班乘客數(shù)量。
year 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
month
Jan 112 115 145 171 196 204 242 284 315 340 360 417
Feb 118 126 150 180 196 188 233 277 301 318 342 391
Mar 132 141 178 193 236 235 267 317 356 362 406 419
Apr 129 135 163 181 235 227 269 313 348 348 396 461
May 121 125 172 183 229 234 270 318 355 363 420 472
Jun 135 149 178 218 243 264 315 374 422 435 472 535
Jul 148 170 199 230 264 302 364 413 465 491 548 622
Aug 148 170 199 242 272 293 347 405 467 505 559 606
Sep 136 158 184 209 237 259 312 355 404 404 463 508
Oct 119 133 162 191 211 229 274 306 347 359 407 461
Nov 104 114 146 172 180 203 237 271 305 310 362 390
Dec 118 140 166 194 201 229 278 306 336 337 405 432
Seaborn的數(shù)據(jù)集合:
https://github.com/mwaskom/seaborn-data
import seaborn as sns
import matplotlib.pyplot as plt
data = sns.load_dataset('flights'). \
pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data)
plt.show()
熱力圖的右側(cè)是 顏色帶,上面代表了數(shù)值到顏色的映射,數(shù)值由小到大對(duì)應(yīng)色彩由暗到亮。
從上面的heatmap,我們可以得到兩層信息,一是隨著時(shí)間的推移,飛機(jī)的乘客數(shù)量是在逐步增多的,二是航班的乘坐旺季在七月和八月份。下面就具體的參數(shù)進(jìn)行演示。
cmap
:設(shè)置顏色帶的色系
有關(guān)色帶的配置見(jiàn)圖文:如何利用colormap讓你的圖表與眾不同?
import seaborn as sns
import matplotlib.pyplot as plt
data = sns.load_dataset('flights'). \
pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r')
plt.show()
annot
:是否顯示數(shù)值注釋
數(shù)值注釋默認(rèn)顯示的是科學(xué)記數(shù)法的數(shù)值,我們得把數(shù)值進(jìn)行格式化,這就用到了下面的參數(shù)。
fmt
:format的縮寫(xiě),設(shè)置數(shù)值的格式化形式
import seaborn as sns
import matplotlib.pyplot as plt
data = sns.load_dataset('flights'). \
pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r', annot=True, fmt='d')
plt.show()
linewidths
:控制每個(gè)小方格之間的間距
import seaborn as sns
import matplotlib.pyplot as plt
data = sns.load_dataset('flights'). \
pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r', annot=True,
fmt='d', linewidths=0.3)
plt.show()
linecolor
:控制分割線的顏色
import seaborn as sns
import matplotlib.pyplot as plt
data = sns.load_dataset('flights'). \
pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r', annot=True,
fmt='d', linewidths=0.3, linecolor='gray')
plt.show()
cbar_kws
:關(guān)于顏色帶的設(shè)置
import seaborn as sns
import matplotlib.pyplot as plt
data = sns.load_dataset('flights'). \
pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r', annot=True,
fmt='d', linewidths=0.3, linecolor='gray',
cbar_kws={'orientation': 'horizontal'})
plt.show()
所用數(shù)據(jù)集mtcars.csv記錄了32種不同品牌的轎車的11個(gè)屬性。
數(shù)據(jù)來(lái)源:
https://gist.github.com/seankross/a412dfbd88b3db70b74b
皮爾遜相關(guān)系數(shù)(Pearson Correlation)是衡量向量相似度的一種方式。
這個(gè)系數(shù)在-1~1之間波動(dòng),0表示完全無(wú)關(guān),1表示完全正相關(guān),-1表示完全負(fù)相關(guān)。
對(duì)相關(guān)的通俗理解可以看圖文:內(nèi)積與相關(guān)
上面數(shù)據(jù)計(jì)算出來(lái)的相關(guān)系數(shù)矩陣如下:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 確保正常顯示中文+負(fù)號(hào)
plt.rcParams['font.sans-serif'] = ['Simhei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(12, 10), dpi=70)
df = pd.read_csv('.\data\mtcars.csv')
pd.set_option('display.max_columns', None)
name = ["汽車名稱", "英里/加侖", "氣缸數(shù)量", "排量", "總馬力",
"驅(qū)動(dòng)軸比", "重量", "1/4英里所用時(shí)間", "引擎",
"變速器", "前進(jìn)檔數(shù)", "化油器數(shù)量"]
df.columns = name
mat = df.corr(method='pearson')
sns.heatmap(data=mat, cmap='RdYlGn', annot=True)
plt.title('mtcars數(shù)據(jù)集的相關(guān)性矩陣', fontsize=22)
plt.xticks(fontsize=12 # 字體大小
, rotation=45 # 字體是否進(jìn)行旋轉(zhuǎn)
, horizontalalignment='right' # 刻度的相對(duì)位置
)
plt.yticks(fontsize=12)
plt.show()
成對(duì)分析圖 是以圖像形式分析多個(gè)變量之間相關(guān)性的圖像,是相關(guān)矩陣圖的具體化。
我們可以使用散點(diǎn)圖或者帶最佳擬合線的散點(diǎn)圖來(lái)描述變量?jī)蓛芍g的關(guān)系。但當(dāng)我們有著探索多個(gè)特征兩兩之間關(guān)系的需求時(shí),一一繪制圖像的效率比較低下,因此我們就可以使用成對(duì)分析圖。它是一種類關(guān)系矩陣的繪圖方式,一次性繪制出所有特征之間的相關(guān)圖像。
def pairplot(
data, *,
hue=None, hue_order=None, palette=None,
vars=None, x_vars=None, y_vars=None,
kind="scatter", diag_kind="auto", markers=None,
height=2.5, aspect=1, corner=False, dropna=False,
plot_kws=None, diag_kws=None, grid_kws=None, size=None,
):
本案例采用的數(shù)據(jù)集是Seaborn中內(nèi)置的iris鳶尾花數(shù)據(jù)集。
數(shù)據(jù)集內(nèi)包含 3 類共 150 條記錄,每類各 50 個(gè)數(shù)據(jù),每條記錄都有 4 項(xiàng)特征:花萼長(zhǎng)度、花萼寬度、花瓣長(zhǎng)度、花瓣寬度,可以通過(guò)這4個(gè)特征預(yù)測(cè)鳶尾花卉屬于山鳶尾(iris-setosa),雜色鳶尾(iris-versicolour),維吉尼亞鳶尾(iris-virginica)中的哪一品種。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('white', {'font.sans-serif': ['simhei', 'Arial']})
data = sns.load_dataset('iris')
data.columns = ["花萼長(zhǎng)", "花萼寬", "花瓣長(zhǎng)", "花瓣寬", "種類"]
kind_dict = {
"setosa": "山鳶尾",
"versicolor": "雜色鳶尾",
"virginica": "維吉尼亞鳶尾"
}
data["種類"] = data["種類"].map(kind_dict)
sns.pairplot(data=data)
plt.show()
可以看到對(duì)角線上是各個(gè)屬性的直方圖(分布圖),而非對(duì)角線上是兩個(gè)不同屬性之間的相關(guān)圖,從圖中我們發(fā)現(xiàn),花瓣的長(zhǎng)度和寬度之間以及萼片的長(zhǎng)短和花瓣的長(zhǎng)、寬之間具有比較明顯的相關(guān)關(guān)系。
kind
:用于控制非對(duì)角線上的圖的類型,可選"scatter"(散點(diǎn)圖)與"reg"(回歸圖)diag_kind
:控制對(duì)角線上的圖的類型,可選"hist"(直方圖)與"kde"(核密度估計(jì)圖)sns.pairplot(data=data, kind='reg', diag_kind='kde')
plt.show()
將 kind
參數(shù)設(shè)置為 "reg" 會(huì)為非對(duì)角線上的散點(diǎn)圖擬合出一條回歸直線,更直觀地顯示變量之間的關(guān)系。
那對(duì)于不同種類的花,其花萼和花瓣有什么比較鮮明的特征嗎?我們通過(guò)hue
參數(shù)把不同種類的花區(qū)分開(kāi),進(jìn)行進(jìn)一步分析。
hue
:按照某個(gè)字段進(jìn)行分類
sns.pairplot(data=data, hue='種類')
plt.show()
我們可以從經(jīng)過(guò)hue
分類后的pairplot
中發(fā)現(xiàn),不論是從對(duì)角線上的分布圖還是從分類后的散點(diǎn)圖,都可以看出對(duì)于不同種類的花,其萼片長(zhǎng)、花瓣長(zhǎng)、花瓣寬的分布差異較大,換句話說(shuō),這些屬性是可以幫助我們?nèi)プR(shí)別不同種類的花的。
比如,對(duì)于萼片、花瓣長(zhǎng)度較短,花瓣寬度較窄的花,那么它大概率是山鳶尾。
當(dāng)然,可以通過(guò) palette 參數(shù)來(lái)調(diào)出自己想要的顏色
palette
:控制色調(diào)
sns.pairplot(data, hue='種類', palette="husl")
plt.show()
markers
:控制散點(diǎn)的樣式
sns.pairplot(data, hue='種類', markers=["*", "s", "D"])
plt.show()
當(dāng)我們想單獨(dú)研究某兩個(gè)(或多個(gè))變量的關(guān)系時(shí),我們只需要通過(guò)vars
參數(shù)指定你想研究的變量
vars,x_vars,y_vars
:選擇數(shù)據(jù)中的特定字段,以list形式傳入
#單獨(dú)用vars參數(shù)選擇"花萼長(zhǎng) "和"花瓣長(zhǎng)"兩種屬性
sns.pairplot(data, hue='種類', vars=["花萼長(zhǎng)", "花瓣長(zhǎng)"])
plt.show()
# 用x_vars和 y_vars參數(shù)指定
# 需要注意的是,x_vars和y_vars要同時(shí)指定
sns.pairplot(data, x_vars=["花萼長(zhǎng)", "花瓣寬"], y_vars=["花萼寬", "花瓣長(zhǎng)"])
plt.show()
更多的樣式可以通過(guò)plot_kws
和diag_kws
來(lái)進(jìn)行控制
plot_kws
:用于控制非對(duì)角線上的圖的樣式
diag_kws
:用于控制對(duì)角線上圖的樣式
sns.pairplot(data, diag_kind="kde", markers="s",
plot_kws=dict(s=50, edgecolor="w", color="g", alpha=.5),
diag_kws=dict(shade=True, color="r"))
plt.show()
參考圖文:
聯(lián)系客服