5.1 热力图 (heatmap) Seaborn 热力图 (Heatmap) 详解与实践 引言 在数据可视化领域,矩阵图 (Matrix Plots) 是一类强大的工具,用于展示矩阵形式数据的模式、关系和结构。Seaborn,作为 Python 中基于 Matplotlib 的高级数据可视化库,提供了便捷且美观的矩阵图绘制功能。其中,热力图 (heatmap) 是矩阵图中最常用且功能强大的类型之一。 热力图通过颜色编码来表示矩阵数据的值,使得用户能够直观地识别数据中的高值区域、低值区域以及潜在的模式。它广泛应用于各个领域,例如: 相关性分析: 展示变量之间的相关性强度。 缺失值可视化: 突出显示数据集中缺失值的位置。 聚类分析: 呈现数据点之间的相似性或距离。
引言
在数据可视化领域,矩阵图 (Matrix Plots) 是一类强大的工具,用于展示矩阵形式数据的模式、关系和结构。Seaborn,作为 Python 中基于 Matplotlib 的高级数据可视化库,提供了便捷且美观的矩阵图绘制功能。其中,热力图 (heatmap) 是矩阵图中最常用且功能强大的类型之一。
热力图通过颜色编码来表示矩阵数据的值,使得用户能够直观地识别数据中的高值区域、低值区域以及潜在的模式。它广泛应用于各个领域,例如:
相关性分析: 展示变量之间的相关性强度。
缺失值可视化: 突出显示数据集中缺失值的位置。
聚类分析: 呈现数据点之间的相似性或距离。
图像处理: 可视化图像像素值的分布。
生物信息学: 展示基因表达数据或蛋白质相互作用。
机器学习: 可视化混淆矩阵、特征重要性等。
5.1 热力图 (heatmap) 的核心概念
热力图的核心思想是将矩阵中的数值映射到颜色空间,从而利用颜色的变化来表示数值的大小。通常,较高的数值会用暖色调 (如红色、橙色、黄色) 表示,较低的数值会用冷色调 (如蓝色、绿色、紫色) 表示。中间值则可以用中性色调 (如白色、灰色) 表示。
关键组成部分:
数据矩阵 (Data Matrix): 热力图的基础是二维数据矩阵,可以是 NumPy 数组、Pandas DataFrame 或其他类似的数据结构。矩阵的行和列代表数据的不同维度或类别,矩阵中的每个元素代表对应行列交叉位置的数值。
颜色映射 (Colormap): 颜色映射 (colormap) 定义了数值到颜色的映射关系。Seaborn 和 Matplotlib 提供了丰富的内置颜色映射,例如 viridis、plasma、magma、coolwarm、RdBu 等。用户也可以自定义颜色映射。
颜色条 (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 (可选): 指定颜色映射的最小值和最大值。如果不指定,则默认使用数据的最小值和最大值。手动设置 vmin 和 vmax 可以用于突出显示数据的特定范围,或者在多个热力图之间进行颜色比较。
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()
代码解释:
导入必要的库:seaborn, matplotlib.pyplot, numpy, pandas。
使用 numpy.random.rand(10, 10) 生成一个 10x10 的随机矩阵。
使用 pd.DataFrame(data).corr() 计算随机矩阵的相关矩阵 (这里只是为了演示,实际应用中通常使用真实数据)。
使用 sns.heatmap(corr_matrix) 绘制热力图,将相关矩阵 corr_matrix 作为数据输入。
plt.title() 添加标题。
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)
xticklabels 和 yticklabels 参数控制 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()
代码解释:
np.triu(np.ones_like(corr_matrix, dtype=bool)) 生成一个与 corr_matrix 形状相同的布尔型上三角矩阵。上三角部分为 True,下三角部分为 False。
sns.heatmap(corr_matrix, mask=mask, ...) 将 mask 参数设置为生成的上三角掩码。这样,热力图将只显示下三角部分,上三角部分被屏蔽。
使用 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 等常用参数,用户可以根据不同的数据和可视化需求,定制出美观且信息丰富的热力图。热力图在相关性分析、混淆矩阵可视化、缺失值可视化等领域具有广泛的应用价值,是数据科学和可视化工具箱中不可或缺的一部分。