這是本學期在大數(shù)據(jù)哲學與社會科學實驗室做的第八次分享了。
第一次分享的是:
第二次分享的是:
第三次分享的是:
第四次分享的是:
第五次分享的是:
第六次分享的是:
第七次分享的是:
本次分享的是“如何利用Seaborn繪制熱力圖?”
Seaborn是在matplotlib的基礎上進行了更高級的API封裝,使得作圖更加容易,不需要經(jīng)過大量的調(diào)整就能使你的圖變得精致。
Seaborn官網(wǎng):
https://seaborn.pydata.org/
Seaborn安裝:
pip install seaborn
Seaborn升級:
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>
熱力圖 就是用顏色深淺來表示數(shù)值大小的圖像。
在實際中常用于展示列聯(lián)表的數(shù)據(jù)分布,以及展示一組變量的相關系數(shù)矩陣,通過熱力圖我們可以非常直觀地感受到數(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ù)多個類別變量來對觀測值進行計數(shù)的表。該表的行和列對應于這些類別變量。
本案例采用的數(shù)據(jù)集是Seaborn中內(nèi)置的flights航班數(shù)據(jù)集,dataframe中的數(shù)據(jù)代表了1949年-1960年每個月的航班乘客數(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ù)值由小到大對應色彩由暗到亮。
從上面的heatmap,我們可以得到兩層信息,一是隨著時間的推移,飛機的乘客數(shù)量是在逐步增多的,二是航班的乘坐旺季在七月和八月份。下面就具體的參數(shù)進行演示。
cmap
:設置顏色帶的色系
有關色帶的配置見圖文:如何利用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ù)值注釋默認顯示的是科學記數(shù)法的數(shù)值,我們得把數(shù)值進行格式化,這就用到了下面的參數(shù)。
fmt
:format的縮寫,設置數(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
:控制每個小方格之間的間距
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
:關于顏色帶的設置
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個屬性。
數(shù)據(jù)來源:
https://gist.github.com/seankross/a412dfbd88b3db70b74b
皮爾遜相關系數(shù)(Pearson Correlation)是衡量向量相似度的一種方式。
這個系數(shù)在-1~1之間波動,0表示完全無關,1表示完全正相關,-1表示完全負相關。
對相關的通俗理解可以看圖文:內(nèi)積與相關
上面數(shù)據(jù)計算出來的相關系數(shù)矩陣如下:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 確保正常顯示中文+負號
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ū)動軸比", "重量", "1/4英里所用時間", "引擎",
"變速器", "前進檔數(shù)", "化油器數(shù)量"]
df.columns = name
mat = df.corr(method='pearson')
sns.heatmap(data=mat, cmap='RdYlGn', annot=True)
plt.title('mtcars數(shù)據(jù)集的相關性矩陣', fontsize=22)
plt.xticks(fontsize=12 # 字體大小
, rotation=45 # 字體是否進行旋轉(zhuǎn)
, horizontalalignment='right' # 刻度的相對位置
)
plt.yticks(fontsize=12)
plt.show()
成對分析圖 是以圖像形式分析多個變量之間相關性的圖像,是相關矩陣圖的具體化。
我們可以使用散點圖或者帶最佳擬合線的散點圖來描述變量兩兩之間的關系。但當我們有著探索多個特征兩兩之間關系的需求時,一一繪制圖像的效率比較低下,因此我們就可以使用成對分析圖。它是一種類關系矩陣的繪圖方式,一次性繪制出所有特征之間的相關圖像。
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 個數(shù)據(jù),每條記錄都有 4 項特征:花萼長度、花萼寬度、花瓣長度、花瓣寬度,可以通過這4個特征預測鳶尾花卉屬于山鳶尾(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 = ["花萼長", "花萼寬", "花瓣長", "花瓣寬", "種類"]
kind_dict = {
"setosa": "山鳶尾",
"versicolor": "雜色鳶尾",
"virginica": "維吉尼亞鳶尾"
}
data["種類"] = data["種類"].map(kind_dict)
sns.pairplot(data=data)
plt.show()
可以看到對角線上是各個屬性的直方圖(分布圖),而非對角線上是兩個不同屬性之間的相關圖,從圖中我們發(fā)現(xiàn),花瓣的長度和寬度之間以及萼片的長短和花瓣的長、寬之間具有比較明顯的相關關系。
kind
:用于控制非對角線上的圖的類型,可選"scatter"(散點圖)與"reg"(回歸圖)diag_kind
:控制對角線上的圖的類型,可選"hist"(直方圖)與"kde"(核密度估計圖)sns.pairplot(data=data, kind='reg', diag_kind='kde')
plt.show()
將 kind
參數(shù)設置為 "reg" 會為非對角線上的散點圖擬合出一條回歸直線,更直觀地顯示變量之間的關系。
那對于不同種類的花,其花萼和花瓣有什么比較鮮明的特征嗎?我們通過hue
參數(shù)把不同種類的花區(qū)分開,進行進一步分析。
hue
:按照某個字段進行分類
sns.pairplot(data=data, hue='種類')
plt.show()
我們可以從經(jīng)過hue
分類后的pairplot
中發(fā)現(xiàn),不論是從對角線上的分布圖還是從分類后的散點圖,都可以看出對于不同種類的花,其萼片長、花瓣長、花瓣寬的分布差異較大,換句話說,這些屬性是可以幫助我們?nèi)プR別不同種類的花的。
比如,對于萼片、花瓣長度較短,花瓣寬度較窄的花,那么它大概率是山鳶尾。
當然,可以通過 palette 參數(shù)來調(diào)出自己想要的顏色
palette
:控制色調(diào)
sns.pairplot(data, hue='種類', palette="husl")
plt.show()
markers
:控制散點的樣式
sns.pairplot(data, hue='種類', markers=["*", "s", "D"])
plt.show()
當我們想單獨研究某兩個(或多個)變量的關系時,我們只需要通過vars
參數(shù)指定你想研究的變量
vars,x_vars,y_vars
:選擇數(shù)據(jù)中的特定字段,以list形式傳入
#單獨用vars參數(shù)選擇"花萼長 "和"花瓣長"兩種屬性
sns.pairplot(data, hue='種類', vars=["花萼長", "花瓣長"])
plt.show()
# 用x_vars和 y_vars參數(shù)指定
# 需要注意的是,x_vars和y_vars要同時指定
sns.pairplot(data, x_vars=["花萼長", "花瓣寬"], y_vars=["花萼寬", "花瓣長"])
plt.show()
更多的樣式可以通過plot_kws
和diag_kws
來進行控制
plot_kws
:用于控制非對角線上的圖的樣式
diag_kws
:用于控制對角線上圖的樣式
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()
參考圖文: