如何利用Seaborn绘制热力图?
如何利用Seaborn绘制热力图?
这是本学期在大数据哲学与社会科学实验室做的第八次分享了。
第一次分享的是:
第二次分享的是:
第三次分享的是:
第四次分享的是:
第五次分享的是:
第六次分享的是:
第七次分享的是:
本次分享的是“如何利用Seaborn绘制热力图?”
1. Seaborn简介
Seaborn是在matplotlib的基础上进行了更高级的API封装,使得作图更加容易,不需要经过大量的调整就能使你的图变得精致。
Seaborn官网:
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>
2. 利用Seaborn绘制热力图
热力图 就是用颜色深浅来表示数值大小的图像。
在实际中常用于展示列联表的数据分布,以及展示一组变量的相关系数矩阵,通过热力图我们可以非常直观地感受到数值大小的差异状况。
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
):
2.1 展示列联表
列联表是根据多个类别变量来对观测值进行计数的表。该表的行和列对应于这些类别变量。
本案例采用的数据集是Seaborn中内置的flights航班数据集,dataframe中的数据代表了1949年-1960年每个月的航班乘客数量。
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的数据集合:
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()
热力图的右侧是 颜色带,上面代表了数值到颜色的映射,数值由小到大对应色彩由暗到亮。
从上面的heatmap,我们可以得到两层信息,一是随着时间的推移,飞机的乘客数量是在逐步增多的,二是航班的乘坐旺季在七月和八月份。下面就具体的参数进行演示。
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
:是否显示数值注释
数值注释默认显示的是科学记数法的数值,我们得把数值进行格式化,这就用到了下面的参数。
fmt
:format的缩写,设置数值的格式化形式
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()
2.2 展示相关系数矩阵
所用数据集mtcars.csv记录了32种不同品牌的轿车的11个属性。
数据来源:
https://gist.github.com/seankross/a412dfbd88b3db70b74b
皮尔逊相关系数(Pearson Correlation)是衡量向量相似度的一种方式。
这个系数在-1~1之间波动,0表示完全无关,1表示完全正相关,-1表示完全负相关。
对相关的通俗理解可以看图文:内积与相关
上面数据计算出来的相关系数矩阵如下:
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 = ["汽车名称", "英里/加仑", "气缸数量", "排量", "总马力",
"驱动轴比", "重量", "1/4英里所用时间", "引擎",
"变速器", "前进档数", "化油器数量"]
df.columns = name
mat = df.corr(method='pearson')
sns.heatmap(data=mat, cmap='RdYlGn', annot=True)
plt.title('mtcars数据集的相关性矩阵', fontsize=22)
plt.xticks(fontsize=12 # 字体大小
, rotation=45 # 字体是否进行旋转
, horizontalalignment='right' # 刻度的相对位置
)
plt.yticks(fontsize=12)
plt.show()
2.3 成对分析图
成对分析图 是以图像形式分析多个变量之间相关性的图像,是相关矩阵图的具体化。
我们可以使用散点图或者带最佳拟合线的散点图来描述变量两两之间的关系。但当我们有着探索多个特征两两之间关系的需求时,一一绘制图像的效率比较低下,因此我们就可以使用成对分析图。它是一种类关系矩阵的绘图方式,一次性绘制出所有特征之间的相关图像。
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,
):
本案例采用的数据集是Seaborn中内置的iris鸢尾花数据集。
数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 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()
可以看到对角线上是各个属性的直方图(分布图),而非对角线上是两个不同属性之间的相关图,从图中我们发现,花瓣的长度和宽度之间以及萼片的长短和花瓣的长、宽之间具有比较明显的相关关系。
kind
:用于控制非对角线上的图的类型,可选"scatter"(散点图)与"reg"(回归图)diag_kind
:控制对角线上的图的类型,可选"hist"(直方图)与"kde"(核密度估计图)
sns.pairplot(data=data, kind='reg', diag_kind='kde')
plt.show()
将 kind
参数设置为 "reg" 会为非对角线上的散点图拟合出一条回归直线,更直观地显示变量之间的关系。
那对于不同种类的花,其花萼和花瓣有什么比较鲜明的特征吗?我们通过hue
参数把不同种类的花区分开,进行进一步分析。
hue
:按照某个字段进行分类
sns.pairplot(data=data, hue='种类')
plt.show()
我们可以从经过hue
分类后的pairplot
中发现,不论是从对角线上的分布图还是从分类后的散点图,都可以看出对于不同种类的花,其萼片长、花瓣长、花瓣宽的分布差异较大,换句话说,这些属性是可以帮助我们去识别不同种类的花的。
比如,对于萼片、花瓣长度较短,花瓣宽度较窄的花,那么它大概率是山鸢尾。
当然,可以通过 palette 参数来调出自己想要的颜色
palette
:控制色调
sns.pairplot(data, hue='种类', palette="husl")
plt.show()
markers
:控制散点的样式
sns.pairplot(data, hue='种类', markers=["*", "s", "D"])
plt.show()
当我们想单独研究某两个(或多个)变量的关系时,我们只需要通过vars
参数指定你想研究的变量
vars,x_vars,y_vars
:选择数据中的特定字段,以list形式传入
#单独用vars参数选择"花萼长 "和"花瓣长"两种属性
sns.pairplot(data, hue='种类', vars=["花萼长", "花瓣长"])
plt.show()
# 用x_vars和 y_vars参数指定
# 需要注意的是,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()
参考图文:
https://www.jianshu.com/p/6e18d21a4cad https://zhuanlan.zhihu.com/p/96040773 https://zhuanlan.zhihu.com/p/98729226