第五章:Seaborn矩阵图 (Matrix Plots)


文档摘要

第五章:Seaborn矩阵图 (Matrix Plots) 第五章:Seaborn 矩阵图 (Matrix Plots) 5.1 矩阵图概述 矩阵图的核心思想是将二维数据以色彩编码的形式呈现出来,使得数据的模式和结构一目了然。在 Seaborn 中,我们主要关注两种类型的矩阵图: 热力图 (Heatmap): 使用颜色深浅来表示数值大小,常用于展示相关性矩阵、缺失值分布、以及各类数值型表格数据。 聚类图 (Clustermap): 在热力图的基础上,增加了层次聚类功能,能够同时对行和列进行聚类,揭示数据中的潜在结构和分组。 应用场景: 矩阵图在数据分析和可视化中有着广泛的应用,例如: 相关性分析: 可视化变量之间的相关性矩阵,快速识别强相关和弱相关变量。

第五章:Seaborn矩阵图 (Matrix Plots)

第五章:Seaborn 矩阵图 (Matrix Plots)

5.1 矩阵图概述

矩阵图的核心思想是将二维数据以色彩编码的形式呈现出来,使得数据的模式和结构一目了然。在 Seaborn 中,我们主要关注两种类型的矩阵图:

  • 热力图 (Heatmap): 使用颜色深浅来表示数值大小,常用于展示相关性矩阵、缺失值分布、以及各类数值型表格数据。

  • 聚类图 (Clustermap): 在热力图的基础上,增加了层次聚类功能,能够同时对行和列进行聚类,揭示数据中的潜在结构和分组。

应用场景:

矩阵图在数据分析和可视化中有着广泛的应用,例如:

  • 相关性分析: 可视化变量之间的相关性矩阵,快速识别强相关和弱相关变量。

  • 缺失值可视化: 展示数据集中缺失值的分布情况,帮助了解数据质量。

  • 特征重要性可视化: 在机器学习模型中,可以使用热力图展示特征的重要性或权重。

  • 基因表达数据分析: 聚类图常用于基因表达数据分析,发现基因之间的共表达模式。

  • 用户行为分析: 可以分析用户行为矩阵,例如用户对不同商品的评分,发现用户偏好和商品之间的关联。

  • 混淆矩阵可视化: 在分类问题中,可以使用热力图展示混淆矩阵,评估模型性能。

为什么选择 Seaborn 绘制矩阵图?

Seaborn 提供了以下优势,使其成为绘制矩阵图的理想选择:

  • 简洁的 API: Seaborn 提供了高层次的接口,可以用几行代码就创建出美观且信息丰富的矩阵图。

  • 美观的默认样式: Seaborn 的默认样式基于现代可视化原则,生成的图形更加专业和易于理解。

  • 强大的定制能力: Seaborn 允许用户高度定制矩阵图的各个方面,包括颜色映射、注释、标签、聚类方法等。

  • 与 Pandas 和 Matplotlib 的良好集成: Seaborn 可以直接处理 Pandas DataFrame 数据,并基于 Matplotlib 进行底层绘图,方便用户进行更高级的定制和扩展。

5.2 热力图 (Heatmap)

热力图是 Seaborn 中最常用的矩阵图类型之一,通过 seaborn.heatmap() 函数实现。它将矩阵数据的值映射到颜色空间,以颜色的深浅来表示数值的大小。

5.2.1 seaborn.heatmap() 函数详解

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 (required): 输入的矩阵数据,可以是二维 NumPy 数组、Pandas DataFrame 或可以转换为 DataFrame 的数据结构。

  • vmin, vmax (optional): 颜色映射的最小值和最大值。如果不指定,则根据数据自动确定。可以用于固定颜色范围,方便比较不同热力图。

  • cmap (optional): 颜色映射方案 (colormap)。Seaborn 和 Matplotlib 提供了丰富的颜色映射方案,例如 'viridis', 'plasma', 'magma', 'Greens', 'Reds', 'coolwarm' 等。可以根据数据类型和可视化目的选择合适的颜色映射。

  • center (optional): 颜色映射的中心值。当数据存在正负值,并且希望以零值为中心进行颜色映射时,可以使用 center 参数。例如,在绘制相关性矩阵时,可以设置 center=0

  • annot (optional): 是否在热力图的每个单元格上显示数值注释。可以设置为 True 显示默认格式的数值,也可以传入格式化字符串 (例如 ".1f") 或二维数组自定义注释内容。

  • fmt (optional): 数值注释的格式化字符串,当 annot=True 时生效。

  • annot_kws (optional): 传递给 matplotlib.axes.Axes.text() 的参数字典,用于定制数值注释的样式,例如字体大小、颜色等。

  • linewidths (optional): 单元格之间的分隔线宽度。

  • linecolor (optional): 单元格分隔线的颜色。

  • cbar (optional): 是否显示颜色棒 (colorbar)。颜色棒用于解释颜色和数值之间的映射关系。

  • cbar_kws (optional): 传递给 matplotlib.figure.Figure.colorbar() 的参数字典,用于定制颜色棒的样式。

  • square (optional): 是否将单元格设置为正方形。

  • xticklabels, yticklabels (optional): 是否显示 x 轴和 y 轴标签。可以设置为 True 显示默认标签 (DataFrame 的列名和索引),设置为 False 不显示标签,也可以传入列表自定义标签内容。设置为 'auto' 时,如果数据量较大,会自动减少标签数量,避免标签重叠。

  • mask (optional): 布尔型矩阵,用于屏蔽热力图的部分单元格。mask 中为 True 的单元格将被屏蔽 (不显示颜色和注释)。

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

  • **kwargs: 其他传递给 matplotlib.pyplot.pcolormesh() 的参数。

5.2.2 代码实践:绘制热力图

示例 1:简单的热力图

首先,我们导入必要的库并创建一个示例数据集 (相关性矩阵):

import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np # 创建一个示例相关性矩阵 np.random.seed(0) data = np.random.rand(10, 10) corr_matrix = pd.DataFrame(data).corr() # 绘制热力图 sns.heatmap(corr_matrix) plt.title('Simple Heatmap') plt.show()

这段代码生成了一个简单的热力图,展示了随机生成的数据的相关性矩阵。默认情况下,Seaborn 使用 'viridis' 颜色映射,并自动调整颜色范围。

示例 2:自定义颜色映射、注释和边框

# 自定义颜色映射、注释和边框 sns.heatmap(corr_matrix, cmap="coolwarm", annot=True, linewidths=.5, linecolor='black') plt.title('Customized Heatmap') plt.show()

在这个示例中,我们使用了 cmap="coolwarm" 将颜色映射设置为 'coolwarm',这是一个适用于展示正负相关性的双色颜色映射。annot=True 在每个单元格上显示数值注释。linewidths=.5linecolor='black' 添加了黑色的单元格边框,使热力图更加清晰。

示例 3:使用 mask 参数屏蔽部分数据

# 创建一个 mask,只显示矩阵的上三角部分 mask = np.triu(np.ones_like(corr_matrix, dtype=bool)) sns.heatmap(corr_matrix, cmap="coolwarm", annot=True, mask=mask) plt.title('Heatmap with Mask') plt.show()

np.triu(np.ones_like(corr_matrix, dtype=bool)) 创建了一个上三角矩阵,作为 mask 参数传入 heatmap() 函数。这样,热力图就只显示了相关性矩阵的上三角部分,通常在展示对称矩阵时使用,避免信息冗余。

示例 4:使用不同数据集:航班乘客数据

我们使用 Seaborn 内置的 flights 数据集来展示热力图在实际数据分析中的应用。flights 数据集记录了每月航班乘客数量。

# 加载 flights 数据集 flights = sns.load_dataset("flights") flights_pivot = flights.pivot_table(index='month', columns='year', values='passengers') # 绘制航班乘客数量热力图 sns.heatmap(flights_pivot, cmap="YlGnBu", annot=True, fmt="d", linewidths=.5) plt.title('Flights Passenger Heatmap') plt.ylabel('Month') plt.xlabel('Year') plt.show()

这段代码首先使用 flights.pivot_table() 将长格式的 flights 数据转换为透视表,使其成为一个以月份为行、年份为列的矩阵。然后使用 sns.heatmap() 绘制热力图,颜色映射设置为 'YlGnBu' (黄绿蓝),annot=True 显示乘客数量,fmt="d" 将注释格式化为整数。

5.2.3 热力图的应用场景和图形解读

  • 相关性分析: 热力图可以直观展示变量之间的相关性强度和方向。颜色越深 (正相关) 或越浅 (负相关) 表示相关性越强。通过观察热力图,可以快速识别哪些变量之间存在强相关关系,为特征选择、模型构建等提供依据。

  • 缺失值可视化: 可以将数据集中的缺失值标记为特殊颜色,例如白色或灰色,绘制热力图。这样可以清晰地看到缺失值在不同变量和样本中的分布情况,帮助了解数据质量问题,并为缺失值处理提供方向。

  • 特征重要性可视化: 在机器学习模型中,例如线性模型、树模型等,可以提取特征的重要性评分或权重系数。将特征重要性或权重系数矩阵绘制成热力图,可以直观展示不同特征的重要性程度,帮助理解模型的工作原理,并进行特征优化。

  • 混淆矩阵可视化: 在分类问题中,混淆矩阵是评估模型性能的重要工具。将混淆矩阵绘制成热力图,可以清晰地展示模型在各个类别上的预测结果,包括真正例、真反例、假正例、假反例的数量,帮助分析模型的优势和不足。

5.3 聚类图 (Clustermap)

聚类图 seaborn.clustermap() 是在热力图的基础上,增加了层次聚类功能的强大可视化工具。它不仅可以展示矩阵数据的热力图,还可以同时对行和列进行层次聚类,并以树状图 (dendrogram) 的形式展示聚类结果。聚类图能够帮助我们发现数据中潜在的结构和分组,尤其适用于探索高维数据的模式。

5.3.1 seaborn.clustermap() 函数详解

seaborn.clustermap() 函数的基本语法如下:

seaborn.clustermap(data, *, pivot_kws=None, method='average', metric='euclidean', z_score=None, standard_scale=None, cluster_method='average', col_cluster=True, row_cluster=True, cmap=None, color_bar=True, cbar_kws=None, tree_kws=None, row_colors=None, col_colors=None, mask=None, linewidths=0, linecolor='white', annot=None, annot_kws=None, fmt='.2g', labels=True, label='row', colors_ratio=0.05, cbar_ax_ratio=0.2, dendrogram_ratio=0.2, sizes=(15, 15), subplot_kws=None, gini_kws=None, figsize=(10, 10), dpi=80, square=False, center=None, robust=False, **kwargs)

常用参数详解 (相较于 heatmap()clustermap() 增加了聚类相关参数):

  • data (required): 输入的矩阵数据,与 heatmap() 相同。

  • method (optional): 层次聚类的方法,例如 'single', 'complete', 'average', 'ward' 等。默认为 'average' (平均 linkage)。

  • metric (optional): 距离度量方法,用于计算样本之间的距离,例如 'euclidean', 'correlation', 'cosine' 等。默认为 'euclidean' (欧氏距离)。

  • z_score (optional): 是否对数据进行 Z-score 标准化。可以设置为 0 对行进行标准化,设置为 1 对列进行标准化。标准化可以使不同量纲的数据具有可比性。

  • standard_scale (optional): 类似于 z_score,但使用标准差进行标准化。可以设置为 0 对行进行标准化,设置为 1 对列进行标准化。

  • row_cluster (optional): 是否对行进行聚类,默认为 True

  • col_cluster (optional): 是否对列进行聚类,默认为 True

  • row_linkage (optional): 预先计算好的行聚类 linkage 矩阵。如果提供,则不进行行聚类,直接使用提供的 linkage 矩阵。

  • col_linkage (optional): 预先计算好的列聚类 linkage 矩阵。如果提供,则不进行列聚类,直接使用提供的 linkage 矩阵。

  • row_colors (optional): 行颜色条,可以为每一行添加颜色标注,用于展示行分组信息或其他行相关的属性。

  • col_colors (optional): 列颜色条,类似于 row_colors,用于列的颜色标注。

  • dendrogram_ratio (optional): 树状图 (dendrogram) 在整个图形中的比例。

  • 其他参数: cmap, annot, mask, linewidths, linecolor, cbar, square, xticklabels, yticklabels 等参数与 heatmap() 函数类似,含义相同。

层次聚类过程 (Graph TD 图):

流程解释:

  1. 数据矩阵: 输入原始数据矩阵。

  2. 计算距离矩阵: 根据指定的距离度量方法 (metric),计算数据矩阵中每对行 (或列) 之间的距离,得到距离矩阵。

  3. 层次聚类算法: 使用指定的层次聚类算法 (method),例如平均 linkage,对距离矩阵进行聚类分析。

  4. 生成树状图: 层次聚类算法会生成两个树状图,分别表示行聚类和列聚类的结果。树状图的分支长度表示聚类距离,分支越短,表示聚类越紧密。

  5. 重新排序矩阵: 根据树状图的聚类结果,对原始数据矩阵的行和列进行重新排序,使得相似的行和列在热力图上相邻。

  6. 绘制热力图: 使用重新排序后的数据矩阵绘制热力图。

  7. 聚类热力图 (Clustermap): 最终的聚类图包含三个主要部分:行树状图、列树状图和热力图。树状图展示了聚类结构,热力图展示了数值大小,两者结合可以有效地揭示数据中的模式。

5.3.2 代码实践:绘制聚类图

示例 1:简单的聚类图

我们继续使用之前的相关性矩阵 corr_matrix 来绘制聚类图。

# 绘制简单的聚类图 sns.clustermap(corr_matrix) plt.title('Simple Clustermap') plt.show()

这段代码生成了一个简单的聚类图,对相关性矩阵的行和列都进行了聚类。默认情况下,clustermap() 使用 'average' linkage 和 'euclidean' 距离度量。

示例 2:自定义聚类方法、距离度量和颜色映射

# 自定义聚类方法、距离度量和颜色映射 sns.clustermap(corr_matrix, method="ward", metric="correlation", cmap="viridis") plt.title('Customized Clustermap') plt.show()

在这个示例中,我们使用了 method="ward" 将聚类方法设置为 Ward linkage,metric="correlation" 将距离度量设置为皮尔逊相关系数距离,cmap="viridis" 将颜色映射设置为 'viridis'。Ward linkage 旨在最小化簇内的方差,适用于发现紧凑的簇。相关系数距离适用于分析变量之间的相关性模式。

示例 3:行列同时聚类、仅行聚类、仅列聚类

# 行列同时聚类 (默认) sns.clustermap(corr_matrix, row_cluster=True, col_cluster=True, cmap="coolwarm") plt.title('Both Row and Column Clustered') plt.show() # 仅行聚类 sns.clustermap(corr_matrix, row_cluster=True, col_cluster=False, cmap="coolwarm") plt.title('Row Clustered Only') plt.show() # 仅列聚类 sns.clustermap(corr_matrix, row_cluster=False, col_cluster=True, cmap="coolwarm") plt.title('Column Clustered Only') plt.show() # 不聚类,仅绘制热力图 (相当于 heatmap) sns.clustermap(corr_matrix, row_cluster=False, col_cluster=False, cmap="coolwarm") plt.title('No Clustering (Heatmap)') plt.show()

通过设置 row_clustercol_cluster 参数,我们可以控制是否对行和列进行聚类。当 row_cluster=Falsecol_cluster=False 时,clustermap() 的行为就退化为 heatmap(),只绘制热力图,不进行聚类。

示例 4:使用 row_colorscol_colors 添加颜色条

# 创建行颜色条和列颜色条 row_colors = pd.Series(np.random.choice(["red", "green", "blue"], size=corr_matrix.shape[0]), index=corr_matrix.index) col_colors = pd.Series(np.random.choice(["purple", "orange"], size=corr_matrix.shape[1]), index=corr_matrix.columns) sns.clustermap(corr_matrix, row_colors=row_colors, col_colors=col_colors, cmap="coolwarm") plt.title('Clustermap with Color Bars') plt.show()

row_colorscol_colors 参数可以接受 Pandas Series 或颜色列表,用于为行和列添加颜色标注。这可以用于展示额外的分组信息或其他行/列相关的属性,增强图形的信息表达能力。

5.3.3 聚类图的应用场景和图形解读

  • 基因表达数据分析: 聚类图在基因表达数据分析中被广泛应用。行表示基因,列表示样本 (例如细胞、组织)。聚类图可以帮助发现基因之间的共表达模式,即哪些基因在不同样本中表达水平相似,从而揭示基因的功能关联和调控机制。同时,聚类图也可以用于样本聚类,发现样本之间的相似性和分组,例如将肿瘤样本根据基因表达谱进行亚型分类。

  • 用户行为分析: 可以分析用户对不同商品的评分矩阵,行表示用户,列表示商品,数值表示评分。聚类图可以帮助发现用户群体和商品类别。例如,聚类分析可能将用户分为偏好高科技产品、偏好家居用品等不同群体,将商品分为电子产品、服装、食品等不同类别。

  • 图像数据分析: 聚类图可以应用于图像数据的可视化和分析。例如,可以将图像像素点的特征向量 (例如 RGB 值、纹理特征) 构成矩阵,然后使用聚类图进行可视化。聚类图可以帮助发现图像中相似的区域和模式,用于图像分割、目标识别等任务。

  • 探索高维数据结构: 聚类图适用于探索高维数据的潜在结构。通过同时对行和列进行聚类,并结合树状图和热力图,可以有效地降低数据维度,揭示数据中的分组和模式,为进一步分析和建模提供 insights。

5.4 高级矩阵图技巧

除了基本的 heatmap()clustermap() 函数,Seaborn 还提供了一些高级技巧,可以进一步定制和优化矩阵图。

  • 自定义颜色映射 (Custom Colormaps): 可以使用 Matplotlib 的 colors.ListedColormapcolors.LinearSegmentedColormap 创建自定义颜色映射,并将其传递给 cmap 参数。这可以实现更精细的颜色控制,满足特定的可视化需求。

  • 使用 mask 参数隐藏部分数据: mask 参数不仅可以用于屏蔽对称矩阵的对角线或上/下三角部分,还可以根据数据值或其他条件,灵活地屏蔽热力图的任意区域,突出显示感兴趣的数据部分。

  • 结合其他 Seaborn 功能 (例如, FacetGrid): 可以将矩阵图与其他 Seaborn 功能结合使用,例如 FacetGrid,创建更复杂的、多面板的矩阵图。例如,可以根据某个分类变量,将数据分成多个子集,并为每个子集绘制矩阵图,进行分组比较分析。

  • 矩阵图的优化和美化技巧: 可以通过调整 fontsizerotationlinewidthslinecolorcbar_kws 等参数,以及使用 Matplotlib 的 API 进行更底层的定制,来优化矩阵图的视觉效果,使其更加清晰、美观、易于理解。例如,可以调整字体大小和旋转角度,避免标签重叠;调整颜色棒的刻度和标签,使其更易于阅读;添加标题和轴标签,清晰地描述图形内容。


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