
当我们进行数据挖掘工作、或者进行数据可视化以更好地展示成果时,很多时候我们需要借助到热地图的帮助。今天,我们就来介绍一下在seaborn绘图库中热地图heatmap的使用方法及参数设置。
热地图使用场景:
进一步查看数据表中特征两两之间的相关性
在数据挖掘的前期工作中,对于研究特征关系十分有效
一、函数体及主要参数
函数体:
seaborn
主要参数:
(1)data:
数据集,可以是array型的数组或者是DataFrame类型。当数据集为DataFrame类型时,数据集的行与列的信息分别对应热地图heatmap的行信息和列信息。也就是说,数据集的索引(index)会作为热地图的行标签,列名会作为热地图的列标签。
(2)矩阵块颜色参数:
- vmax、vmin:分别是热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定。
- cmap:从数字到色彩空间的映射,取值是matplotlib包里的colormap名称或颜色对象,或者表示颜色的列表;改参数默认值:根据center参数设定
- center:数据表取值有差异时,设置热力图的色彩中心对齐值;通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变
- robust:默认取值False;如果是False,且没设定vmin和vmax的值,热力图的颜色映射范围根据具有鲁棒性的分位数设定,而不是用极值设定。
(3)热力图矩阵块注释参数:
- annot(annotate的缩写):默认取值False;如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据。
- fmt:字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字。
- annot_kws:默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置。
(4)热力图矩阵块之间间隔及间隔线参数:
- linewidths:定义热力图里“表示两两特征关系的矩阵小块”之间的间隔大小。
- linecolor:切分热力图上每个矩阵小块的线的颜色,默认值是’white’
(5)热力图颜色刻度条参数:
- cbar:是否在热力图侧边绘制颜色刻度条,默认值是True。
- cbar_kws:热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None。
- cbar_ax:热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None。
(6)square:设置热力图矩阵小块形状,默认值是False
- xticklabels、yticklabels:xticklabels控制每列标签名的输出;yticklabels控制每行标签名的输出。默认值是auto。如果是True,则以DataFrame的列名作为标签名。如果是False,则不添加行标签名。如果是列表,则标签名改为列表中给的内容。如果是整数K,则在图上每隔K个标签进行一次标注。 如果是auto,则自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出。
- mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉。
- ax:设置作图的坐标轴,一般画多个子图时需要修改不同的子图的该值
二、实例操作
(1)数据集介绍
本次实例,我们使用之前的肝炎数据集。有需要的同学可以看看之前的文章:
侦探L:Pandas与机器学习实例——肝炎数据集(1)zhuanlan.zhihu.com
看一下我们本次实例用到的数据表:
df[['类固醇','疲惫','不适','厌食','肝大','肝硬化','脾可触','蛛状','腹腔积水','静脉曲张']].head(10)

可以看到,数据表中的特征都是取值0与1的分类型数据。
我们的目的是,查看这些特征两两之间的相关性。
首先,使用corr()获取这些特征的相关系数表:
corr = df[['类固醇','疲惫','不适','厌食','肝大','肝硬化','脾可触','蛛状','腹腔积水','静脉曲张']].corr()
corr

可以看到,由于数据的特征列较多,因此我们无法直观上看出各个特征的相关程度。这时候,就需要借助我们的热地图heatmap。
导入我们绘图所需要的库:
from matplotlib import pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set()
(这里我用的是jupyter notebook,因此在会多加一条%matplotlib inline的代码,这条命令的作用是将 Matplotlib 绘制的图形嵌入在当前页面中。而在桌面环境中绘图时,不需要添加此命令,而是在全部绘图代码之后追加plt.show( ))
(2)进行测试
1、使用默认参数:
plt.rcParams['font.sans-serif']=['SimHei']
fig = plt.figure(figsize=(10,10))
sns.heatmap(corr)
plt.show()

可以看到此时我们绘制出了一个基本的热地图,从右边的绘制颜色刻度条可以看到,颜色越浅,则特征之间的相关性越强。
2、尝试利用annot = True在热地图每个方格写入数据:
plt.rcParams['font.sans-serif']=['SimHei']
fig = plt.figure(figsize=(10,10))
sns.heatmap(corr,annot = True)
plt.show()

可以看到,此时我们热地图的信息变得更加清晰了。
3、利用linewidths在热地图的矩阵块之间设置分隔线:
plt.rcParams['font.sans-serif']=['SimHei']
fig = plt.figure(figsize=(10,10))
sns.heatmap(corr,annot = True,linewidths=1)
plt.show()

在热地图的日常使用中,annot和linewidths是比较常用的两个参数,由于篇幅原因,其他参数我们就不一一调试了,感兴趣的同学可以自己动手试试~
三、本例中使用热地图的好处
通过使用热地图,我们可以比较直观地得到以下两个结论:
1、“不适”和“疲惫”两列的相关性较强,达到0.59;也就是说,感到“不适”的患者,很多也伴随着“疲惫”症状。
2、“不适”和“厌食”两列的相关性较强,达到0.6;也就是说,感到“不适”的患者,很多同时也伴随着“厌食”的情况。
以上便是<如何在python中绘制热地图(实例)>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~