5.1 热力图 (heatmap)


文档摘要

5.1 热力图 (heatmap) Seaborn 热力图 (Heatmap) 详解与实践 引言 在数据可视化领域,矩阵图 (Matrix Plots) 是一类强大的工具,用于展示矩阵形式数据的模式、关系和结构。Seaborn,作为 Python 中基于 Matplotlib 的高级数据可视化库,提供了便捷且美观的矩阵图绘制功能。其中,热力图 (heatmap) 是矩阵图中最常用且功能强大的类型之一。 热力图通过颜色编码来表示矩阵数据的值,使得用户能够直观地识别数据中的高值区域、低值区域以及潜在的模式。它广泛应用于各个领域,例如: 相关性分析: 展示变量之间的相关性强度。 缺失值可视化: 突出显示数据集中缺失值的位置。 聚类分析: 呈现数据点之间的相似性或距离。

5.1 热力图 (heatmap)

Seaborn 热力图 (Heatmap) 详解与实践

引言

在数据可视化领域,矩阵图 (Matrix Plots) 是一类强大的工具,用于展示矩阵形式数据的模式、关系和结构。Seaborn,作为 Python 中基于 Matplotlib 的高级数据可视化库,提供了便捷且美观的矩阵图绘制功能。其中,热力图 (heatmap) 是矩阵图中最常用且功能强大的类型之一。

热力图通过颜色编码来表示矩阵数据的值,使得用户能够直观地识别数据中的高值区域、低值区域以及潜在的模式。它广泛应用于各个领域,例如:

  • 相关性分析: 展示变量之间的相关性强度。

  • 缺失值可视化: 突出显示数据集中缺失值的位置。

  • 聚类分析: 呈现数据点之间的相似性或距离。

  • 图像处理: 可视化图像像素值的分布。

  • 生物信息学: 展示基因表达数据或蛋白质相互作用。

  • 机器学习: 可视化混淆矩阵、特征重要性等。

5.1 热力图 (heatmap) 的核心概念

热力图的核心思想是将矩阵中的数值映射到颜色空间,从而利用颜色的变化来表示数值的大小。通常,较高的数值会用暖色调 (如红色、橙色、黄色) 表示,较低的数值会用冷色调 (如蓝色、绿色、紫色) 表示。中间值则可以用中性色调 (如白色、灰色) 表示。

关键组成部分:

  • 数据矩阵 (Data Matrix): 热力图的基础是二维数据矩阵,可以是 NumPy 数组、Pandas DataFrame 或其他类似的数据结构。矩阵的行和列代表数据的不同维度或类别,矩阵中的每个元素代表对应行列交叉位置的数值。

  • 颜色映射 (Colormap): 颜色映射 (colormap) 定义了数值到颜色的映射关系。Seaborn 和 Matplotlib 提供了丰富的内置颜色映射,例如 viridisplasmamagmacoolwarmRdBu 等。用户也可以自定义颜色映射。

  • 颜色条 (Colorbar): 颜色条 (colorbar) 是热力图旁边的一个颜色刻度,用于解释颜色与数值之间的对应关系。颜色条可以帮助用户准确理解热力图所表示的数据含义。

  • 注释 (Annotations): 为了更精确地展示数值,热力图通常会在每个单元格内添加数值注释。Seaborn 允许用户自定义注释的格式和显示方式。

  • 聚类 (Clustering - 可选): 对于某些应用场景,例如基因表达数据可视化,可能需要在绘制热力图之前对数据进行聚类分析,以便将相似的行或列聚集在一起,从而更清晰地展示数据模式。Seaborn 提供了 clustermap() 函数来实现带聚类的热力图。

5.1.1 使用 seaborn.heatmap() 绘制基本热力图

Seaborn 中绘制热力图的核心函数是 seaborn.heatmap()。其基本语法如下:

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 (必需): 二维数据集,可以是 Pandas DataFrame、NumPy 数组或可转换为 DataFrame 的数据。这是热力图要展示的核心数据。

  • vmin, vmax (可选): 指定颜色映射的最小值和最大值。如果不指定,则默认使用数据的最小值和最大值。手动设置 vminvmax 可以用于突出显示数据的特定范围,或者在多个热力图之间进行颜色比较。

  • cmap (可选): 指定颜色映射。可以是 Matplotlib 颜色映射名称 (字符串) 或 Colormap 对象。例如,'viridis', 'coolwarm', plt.cm.RdBu

  • center (可选): 如果希望颜色映射以某个特定值居中,可以设置 center 参数。通常用于发散型颜色映射,例如 coolwarm,并将其中心值设置为 0,以便清晰地展示正负偏差。

  • annot (可选): 布尔值或矩阵。如果为 True,则在每个单元格上绘制数值注释。如果传入矩阵,则使用该矩阵作为注释内容。

  • fmt (可选): 字符串格式代码,用于控制注释的显示格式。例如,".2f" 表示保留两位小数的浮点数,"d" 表示整数,".1%" 表示百分比格式。

  • annot_kws (可选): 字典,用于自定义注释的文本属性,例如字体大小、颜色等。

  • linewidths (可选): 单元格之间的线条宽度。设置为 0 可以去除单元格边框。

  • linecolor (可选): 单元格之间的线条颜色。

  • cbar (可选): 布尔值,是否显示颜色条。默认为 True

  • cbar_kws (可选): 字典,用于自定义颜色条的属性,例如标签、刻度、方向等。

  • square (可选): 布尔值,是否使单元格呈正方形。默认为 False

  • xticklabels, yticklabels (可选): 控制 x 轴和 y 轴刻度标签的显示。可以设置为 True (显示列名/行名)、False (不显示)、"auto" (自动判断)、列表 (自定义标签) 或整数 (每隔多少个刻度显示一个标签)。

  • mask (可选): 布尔型矩阵,用于屏蔽热力图的某些单元格。True 值对应的单元格将被屏蔽 (不显示颜色和注释)。

  • ax (可选): Matplotlib Axes 对象,用于在指定的 Axes 对象上绘制热力图。

代码示例 5.1.1:绘制基本热力图

import seaborn as sns import matplotlib.pyplot as plt import numpy as np import pandas as pd # 生成示例数据 (随机相关矩阵) np.random.seed(0) data = np.random.rand(10, 10) corr_matrix = pd.DataFrame(data).corr() # 绘制基本热力图 plt.figure(figsize=(8, 6)) # 设置图形大小 sns.heatmap(corr_matrix) plt.title('Basic Heatmap of Correlation Matrix') plt.show()

代码解释:

  1. 导入必要的库:seaborn, matplotlib.pyplot, numpy, pandas

  2. 使用 numpy.random.rand(10, 10) 生成一个 10x10 的随机矩阵。

  3. 使用 pd.DataFrame(data).corr() 计算随机矩阵的相关矩阵 (这里只是为了演示,实际应用中通常使用真实数据)。

  4. 使用 sns.heatmap(corr_matrix) 绘制热力图,将相关矩阵 corr_matrix 作为数据输入。

  5. plt.title() 添加标题。

  6. plt.show() 显示图形。

运行这段代码,你将看到一个简单的热力图,颜色条显示在右侧,默认使用 viridis 颜色映射,没有数值注释。

5.1.2 自定义颜色映射 (cmap)

cmap 参数允许用户选择不同的颜色映射来增强热力图的可视化效果。Seaborn 和 Matplotlib 提供了多种内置颜色映射,可以根据数据的性质和可视化目的进行选择。

常见颜色映射类型:

  • 顺序型 (Sequential): 适用于表示线性递增或递减的数据,例如 viridis, plasma, magma, Greens, Blues, Greys

  • 发散型 (Diverging): 适用于表示数据偏离中心值的程度,例如 coolwarm, RdBu, RdGy, PuOr. 通常需要配合 center 参数使用。

  • 定性型 (Qualitative): 适用于表示离散的类别数据,例如 Set1, Set2, Paired. 通常不适用于热力图,因为热力图主要用于连续数值数据。

代码示例 5.1.2:使用不同的颜色映射

# 使用 'coolwarm' 颜色映射 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, cmap='coolwarm') plt.title('Heatmap with "coolwarm" Colormap') plt.show() # 使用 'viridis' 颜色映射 (默认) plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, cmap='viridis') plt.title('Heatmap with "viridis" Colormap (Default)') plt.show() # 使用 Matplotlib 的颜色映射对象 import matplotlib.cm as cm plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, cmap=cm.RdBu) plt.title('Heatmap with Matplotlib RdBu Colormap') plt.show()

代码解释:

  • 分别使用字符串 'coolwarm''viridis' 以及 Matplotlib 的颜色映射对象 cm.RdBu 作为 cmap 参数的值,绘制了三种不同颜色映射的热力图。

  • coolwarm 是一种发散型颜色映射,适合展示正负相关性,以白色为中心,蓝色表示负相关,红色表示正相关。

  • viridis 是 Seaborn 和 Matplotlib 的默认颜色映射,是一种感知均匀的顺序型颜色映射,颜色变化平滑,更易于解读。

  • RdBu 是另一种常用的发散型颜色映射,红色到蓝色,中间白色。

5.1.3 添加数值注释 (annot, fmt)

annot 参数控制是否在热力图的单元格中显示数值注释。fmt 参数控制注释的格式。

代码示例 5.1.3:添加和格式化数值注释

# 添加数值注释,默认格式 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, annot=True) plt.title('Heatmap with Annotations (Default Format)') plt.show() # 添加数值注释,指定格式为保留两位小数的浮点数 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, annot=True, fmt=".2f") plt.title('Heatmap with Annotations (Format ".2f")') plt.show() # 添加数值注释,并自定义注释文本属性 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, annot=True, fmt=".1f", annot_kws={"fontsize": 8, "color": 'white'}) plt.title('Heatmap with Annotations (Customized Text)') plt.show()

代码解释:

  • annot=True 开启数值注释显示。

  • fmt=".2f" 指定注释格式为保留两位小数的浮点数。

  • annot_kws={"fontsize": 8, "color": 'white'} 使用字典 annot_kws 自定义注释的字体大小和颜色。

5.1.4 自定义颜色条 (cbar, cbar_kws)

cbar 参数控制是否显示颜色条,cbar_kws 参数允许自定义颜色条的属性。

代码示例 5.1.4:自定义颜色条

# 不显示颜色条 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, cbar=False) plt.title('Heatmap without Colorbar') plt.show() # 自定义颜色条标签和刻度 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, cbar_kws={'label': 'Correlation Coefficient', 'ticks': [-1, -0.5, 0, 0.5, 1]}) plt.title('Heatmap with Customized Colorbar') plt.show() # 将颜色条放置在顶部 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, cbar_kws={'orientation': 'horizontal'}, cbar_ax=plt.axes([0.25, 0.95, 0.5, 0.03])) # 手动指定颜色条位置 plt.title('Heatmap with Colorbar at Top') plt.show()

代码解释:

  • cbar=False 隐藏颜色条。

  • cbar_kws={'label': 'Correlation Coefficient', 'ticks': [-1, -0.5, 0, 0.5, 1]} 使用 cbar_kws 字典设置颜色条的标签为 "Correlation Coefficient",并自定义刻度位置。

  • cbar_kws={'orientation': 'horizontal'}, cbar_ax=plt.axes([0.25, 0.95, 0.5, 0.03]) 将颜色条方向设置为水平 (orientation='horizontal'),并使用 cbar_ax 参数手动指定颜色条的位置和大小。 plt.axes([left, bottom, width, height]) 定义了一个新的 Axes 对象,用于放置颜色条。

5.1.5 调整轴刻度标签 (xticklabels, yticklabels)

xticklabelsyticklabels 参数控制 x 轴和 y 轴刻度标签的显示和内容。

代码示例 5.1.5:调整轴刻度标签

# 隐藏轴刻度标签 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, xticklabels=False, yticklabels=False) plt.title('Heatmap without Axis Tick Labels') plt.show() # 自定义轴刻度标签 labels = [f'Variable {i+1}' for i in range(10)] # 生成自定义标签 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, xticklabels=labels, yticklabels=labels) plt.title('Heatmap with Customized Axis Tick Labels') plt.show() # 每隔两个刻度显示一个标签 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, xticklabels=2, yticklabels=2) plt.title('Heatmap with Sparse Axis Tick Labels') plt.show()

代码解释:

  • xticklabels=False, yticklabels=False 隐藏 x 轴和 y 轴刻度标签。

  • xticklabels=labels, yticklabels=labels 使用自定义的标签列表 labels 作为轴刻度标签。

  • xticklabels=2, yticklabels=2 设置每隔两个刻度显示一个标签,可以避免标签重叠。

5.1.6 使用掩码 (mask) 隐藏部分单元格

mask 参数允许用户创建一个布尔型矩阵,用于屏蔽热力图的某些单元格,使其不显示颜色和注释。这在某些场景下非常有用,例如:

  • 只显示相关矩阵的下三角或上三角: 相关矩阵是对称的,只显示一半即可。

  • 突出显示缺失值: 可以将缺失值的位置标记为 True,然后使用掩码隐藏这些单元格,或者使用特殊的颜色填充。

代码示例 5.1.6:使用掩码显示相关矩阵的下三角

# 创建上三角掩码 mask = np.triu(np.ones_like(corr_matrix, dtype=bool)) # np.triu 生成上三角矩阵,np.ones_like 生成与 corr_matrix 形状相同的全 1 矩阵,dtype=bool 转换为布尔型 plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, mask=mask, cmap='coolwarm', annot=True, fmt=".2f") # 应用掩码,并使用 'coolwarm' 颜色映射 plt.title('Heatmap with Mask (Lower Triangle of Correlation Matrix)') plt.show()

代码解释:

  1. np.triu(np.ones_like(corr_matrix, dtype=bool)) 生成一个与 corr_matrix 形状相同的布尔型上三角矩阵。上三角部分为 True,下三角部分为 False

  2. sns.heatmap(corr_matrix, mask=mask, ...)mask 参数设置为生成的上三角掩码。这样,热力图将只显示下三角部分,上三角部分被屏蔽。

  3. 使用 cmap='coolwarm'annot=True, fmt=".2f" 进一步美化热力图。

5.1.7 使用 square=True 使单元格呈正方形

square=True 参数可以使热力图的单元格强制呈正方形,这在某些情况下可以使图形更美观和易于比较。

代码示例 5.1.7:使用 square=True

plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, square=True, cmap='viridis') plt.title('Heatmap with Square Cells') plt.show()

代码解释:

  • square=True 使热力图的单元格呈正方形。

5.1.8 热力图的应用场景

1. 相关性矩阵可视化:

热力图是可视化相关性矩阵的理想工具。通过颜色深浅和色调变化,可以直观地识别变量之间的正相关、负相关和不相关关系。

代码示例 5.1.8.1:相关性矩阵热力图

# 加载示例数据集 (鸢尾花数据集) iris = sns.load_dataset('iris') corr_iris = iris.corr() # 计算鸢尾花数据集特征之间的相关性矩阵 plt.figure(figsize=(8, 6)) sns.heatmap(corr_iris, annot=True, cmap='RdBu_r', fmt=".2f", square=True, linewidths=.5) # 使用 RdBu_r 颜色映射 (反转的 RdBu),突出显示正负相关性 plt.title('Correlation Matrix of Iris Dataset') plt.show()

2. 混淆矩阵可视化 (机器学习):

在机器学习中,混淆矩阵用于评估分类模型的性能。热力图可以清晰地展示混淆矩阵,帮助理解模型在不同类别上的预测结果。

代码示例 5.1.8.2:混淆矩阵热力图

from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt import seaborn as sns # 假设 y_true 和 y_pred 是真实标签和预测标签 y_true = [0, 1, 0, 1, 2, 0, 1, 2, 2, 1] y_pred = [0, 1, 1, 1, 2, 0, 0, 2, 2, 1] cm = confusion_matrix(y_true, y_pred) # 计算混淆矩阵 plt.figure(figsize=(8, 6)) sns.heatmap(cm, annot=True, fmt="d", cmap='Blues', xticklabels=['Class 0', 'Class 1', 'Class 2'], # 自定义类别标签 yticklabels=['Class 0', 'Class 1', 'Class 2']) plt.xlabel('Predicted Label') plt.ylabel('True Label') plt.title('Confusion Matrix Heatmap') plt.show()

3. 缺失值可视化:

热力图可以用于可视化数据集中缺失值的分布情况。通过将缺失值标记为一种颜色,非缺失值标记为另一种颜色,可以快速识别缺失值集中的区域。

代码示例 5.1.8.3:缺失值热力图

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import numpy as np # 创建包含缺失值的示例 DataFrame data = {'A': [1, 2, np.nan, 4, 5], 'B': [6, np.nan, 8, 9, 10], 'C': [11, 12, 13, np.nan, 15]} df = pd.DataFrame(data) plt.figure(figsize=(8, 6)) sns.heatmap(df.isnull(), cbar=False, cmap='viridis') # 使用 df.isnull() 生成布尔型 DataFrame,True 表示缺失值,False 表示非缺失值 plt.title('Missing Value Heatmap') plt.show()

mermaid 图表 - 热力图参数配置流程

为了更清晰地展示 seaborn.heatmap() 函数的参数配置流程,我们可以使用 Mermaid 的 graph TD 绘制一个流程图。

总结

Seaborn 的 heatmap() 函数为绘制热力图提供了强大而灵活的工具。通过掌握 data, cmap, annot, fmt, cbar_kws, xticklabels, yticklabels, mask 等常用参数,用户可以根据不同的数据和可视化需求,定制出美观且信息丰富的热力图。热力图在相关性分析、混淆矩阵可视化、缺失值可视化等领域具有广泛的应用价值,是数据科学和可视化工具箱中不可或缺的一部分。


发布者: 作者: 转发
评论区 (0)
U