热力图

利用热力图可以看数据表里多个特征两两的相似度。

seaborn.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)

热力图输入数据参数:

data:矩阵数据集,可以是numpy的数组(array),也可以是pandas的DataFrame。如果是DataFrame,则 df 的index/column信息会分别对应到heatmap的columns和rows,即df.index是热力图的行标,df.columns是热力图的列标

热力图矩阵块颜色参数:

vmax,vmin:分别是热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定

cmap:从数字到色彩空间的映射,取值是matplotlib包里的colormap名称或颜色对象,或者表示颜色的列表;改参数默认值:根据center参数设定

center:数据表取值有差异时,设置热力图的色彩中心对齐值;通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变 robust: 默认取值False;如果是False,且没设定vmin和vmax的值,热力图的颜色映射范围根据具有鲁棒性的分位数设定,而不是用极值设定

热力图矩阵块注释参数:

annot(annotate的缩写):默认取值False;如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据 fmt:字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字 annot_kws:默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置;官方文档:

热力图矩阵块之间间隔及间隔线参数:

linewidths: 定义热力图里“表示两两特征关系的矩阵小块”之间的间隔大小 linecolor: 切分热力图上每个矩阵小块的线的颜色,默认值是’white’

热力图颜色刻度条参数:

cbar: 是否在热力图侧边绘制颜色刻度条,默认值是 True cbar_kws: 热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None cbar_ax: 热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None

square:设置热力图矩阵小块形状,默认值是False

xticklabels, yticklabels:xticklabels控制每列标签名的输出;yticklabels控制每行标签名的输出。默认值是auto。如果是True,则以DataFrame的列名作为标签名。如果是False,则不添加行标签名。如果是列表,则标签名改为列表中给的内容。如果是整数K,则在图上每隔K个标签进行一次标注。 如果是auto,则自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出 mask: 控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉 ax:设置作图的坐标轴,一般画多个子图时需要修改不同的子图的该值 \kwargs: All other keyword arguments are passed to ax.pcolormesh

测试:

import seaborn as sns
sns.set(font_scale=1.5)

采用的数据集是 Seaborn 中内置的 flights航班数据集

#导入数据集后按年月两个维度进行数据透视
data=sns.load_dataset("flights")\
        .pivot("month","year","passengers") 
data.head()

undefined

sns.set_context({"figure.figsize":(8,8)})
sns.heatmap(data=data,square=True) 
#可以看到热力图主要展示的是二维数据的数据关系
#不同大小的值对应不同的颜色深浅

undefined

热力图的右侧是颜色带,上面代表了数值到颜色的映射,数值由小到大对应色彩由暗到亮。从上面的heatmap中我们可以得到两层信息,一是随着时间的推移,飞机的乘客数量是在逐步增多的,二是航班的乘坐旺季在七月和八月份

参数 vmax,vmin

vmax:设置颜色带的最大值 vmin:设置颜色带的最小值

sns.heatmap(data=data,vmin=200,vmax=500)

undefined

可以看到右侧的颜色带最大最小值变了,而heatmap中颜色映射关系也会随之调整,将本图和上面的图进行对比便一目了然。

参数cmap

cmap:设置颜色带的色系

sns.heatmap(data=data,cmap="RdBu_r")

undefined

参数center

center:设置颜色带的分界线

undefined

细心的朋友可以察觉到颜色带上色彩两级的分界线变成了300

参数annot

annot:是否显示数值注释

undefined

怎么回事?乱码了吗?其实数值注释默认显示的是科学记数法的数值,我们得把数值进行格式化,这就用到了下面的参数。

参数fmt

fmt:format的缩写,设置数值的格式化形式

undefined

参数 annot_kws

修改注释的字体等格式

#annot(矩阵上数字),annot_kws(矩阵上数字的大小颜色字体)matplotlib包text类下的字体设置

import numpy as np
np.random.seed(20180316)
x = np.random.randn(4, 4)

f, (ax1, ax2) = plt.subplots(figsize=(6,6),nrows=2)

sns.heatmap(x, annot=True, ax=ax1)

sns.heatmap(x, annot=True, ax=ax2, annot_kws={'size':9,'weight':'bold', 'color':'blue'})
# Keyword arguments for ax.text when annot is True.  http://stackoverflow.com/questions/35024475/seaborn-heatmap-key-words

undefined

参数 linewidths

linewidths:控制每个小方格之间的间距

undefined

参数 linecolor

linecolor:控制分割线的颜色

undefined

参数 cbar_kws

cbar_kws:关于颜色带的设置

undefined

参数 ax

多子图时 指定当前子图的位置

#cmap(颜色)

import matplotlib.pyplot as plt
import seaborn as sns
% matplotlib inline

f, (ax1,ax2) = plt.subplots(figsize = (6,4),nrows=2)

# cmap用cubehelix map颜色
cmap = sns.cubehelix_palette(start = 1.5, rot = 3, gamma=0.8, as_cmap = True)
pt = df.corr()   # pt为数据框或者是协方差矩阵
sns.heatmap(pt, linewidths = 0.05, ax = ax1, vmax=900, vmin=0, cmap=cmap)
ax1.set_title('cubehelix map')
ax1.set_xlabel('')
ax1.set_xticklabels([]) #设置x轴图例为空值
ax1.set_ylabel('kind')

# cmap用matplotlib colormap
sns.heatmap(pt, linewidths = 0.05, ax = ax2, vmax=900, vmin=0, cmap='rainbow') 
# rainbow为 matplotlib 的colormap名称
ax2.set_title('matplotlib colormap')
ax2.set_xlabel('region')
ax2.set_ylabel('kind')

undefined

参数 mask

mask 对某些矩阵块进行覆盖

#mask对某些矩阵块的显示进行覆盖

f, (ax1,ax2) = plt.subplots(figsize = (5,5),nrows=2)

cmap = sns.cubehelix_palette(start = 1.5, rot = 3, gamma=0.8, as_cmap = True)

p1 = sns.heatmap(pt, ax=ax1, cmap=cmap, xticklabels=False, mask=None)
ax1.set_title('mask=None')
ax1.set_ylabel('kind')

p2 = sns.heatmap(pt, ax=ax2, cmap=cmap, xticklabels=True, mask=(pt<800))   
#mask对pt进行布尔型转化,结果为True的位置用白色覆盖
ax2.set_title('mask: boolean DataFrame')
ax2.set_xlabel('region')
ax2.set_ylabel('kind')

undefined

用mask实现:突出显示某些数据

f,(ax1,ax2) = plt.subplots(figsize=(4,6),nrows=2)
x = np.array([[1,2,3],[2,0,1],[-1,-2,0]])
sns.heatmap(x, annot=True, ax=ax1)
sns.heatmap(x, mask=x < 1, ax=ax2, annot=True, annot_kws={"weight": "bold"})   #把小于1的区域覆盖掉

undefined

参考

python可视化——热力图

heatmap热力图

Update time: 2020-05-23

results matching ""

    No results matching ""