聚类热图是一种直观的数据可视化工具。它以矩形彩色图表的形式呈现数据矩阵,每个单元格颜色对应特定数值,通常从低值的冷色调到高值的暖色调渐变。常应用于多个领域,如生物学中分析基因表达、蛋白质相互作用和生物群落;金融领域用于股票价格变化分析和风险评估;地理信息领域展示人口密度、气候数据等。还可用于网页设计分析用户行为及物流供应链管理。热图常结合层次聚类,以树状图展示行和列的聚类结果,便于发现相似模式。它能快速呈现复杂数据的结构和模式,帮助人们发现潜在规律和关系。
0x01 使用heatmap()函数
一、函数用法及参数说明
heatmap(x)
- 1 主要输入数据参数
x
:要绘制热图的数值矩阵。
- 2 树状图和排序参数
- 2.1
Rowv
:确定是否以及如何计算和重新排序行树状图。可以是树状图、用于重新排序行树状图的向量、NA
(表示不显示行树状图且不进行重新排序)或默认值NULL
。 - 2.2
Colv
:确定是否以及如何对列树状图进行重新排序。具有与Rowv
参数相同的选项,并且当x
是方阵时,Colv = "Rowv"
表示列应与行相同处理。
- 2.1
- 3 距离和聚类函数参数
- 3.1
distfun
:用于计算行和列之间距离(不相似性)的函数,默认为dist
。 - 3.2
hclustfun
:用于在Rowv
或Colv
不是树状图时计算层次聚类的函数,默认为hclust。
- 3.1
- 4 重新排序函数参数
reorderfun
:函数function(d, w)
,用于重新排序行和列树状图,默认使用reorder.dendrogram
。
- 5 表达式和对称参数
- 5.1
add.expr
:在调用image
之后要评估的表达式,可用于向绘图添加组件。 - 5.2
symm
:逻辑值,指示是否对称地处理x
,仅当x
是方阵时可以为TRUE
。 - 5.3
revC
:逻辑值,指示是否应反转列顺序进行绘图,例如在对称情况下,对称轴与通常情况相同。
- 5.1
- 6 标准化参数
scale
:字符值,指示是否在行方向或列方向上对数值进行中心化和缩放,或不进行缩放,可选值为 “row”、“column” 和 “none”。默认值在symm
为FALSE
时是 “row”,否则是 “none”。
- 7 缺失值处理和边距参数
- 7.1
na.rm
:逻辑值,指示是否应删除NA
值。 - 7.2
margins
:长度为 2 的数值向量,分别包含列和行名称的边距。
- 7.1
- 8 颜色侧边栏参数
- 8.1
ColSideColors
:可选的长度为ncol(x)
的字符向量,包含用于水平侧边栏的颜色名称,可用于注释x
的列。 - 8.2
RowSideColors
:可选的长度为nrow(x)
的字符向量,包含用于垂直侧边栏的颜色名称,可用于注释x
的行。
- 8.1
- 9 字体大小和标签参数
- 9.1
cexRow
和cexCol
:正数,用于在行或列轴标签中作为cex.axis
。目前默认值仅分别使用行数或列数。 - 9.2
labRow
和labCol
:用于行和列标签的字符向量,默认分别为rownames(x)
和colnames(x)
。
- 9.1
- 10 标题和保留树状图参数
- 10.1
main
、xlab
、ylab
:主标题、x 轴和 y 轴标题,默认为无。 - 10.2
keep.dendro
:逻辑值,指示是否应将树状图保留为结果的一部分(当Rowv
和 / 或Colv
不为NA
时)。
- 10.1
- 11 其他参数
verbose
:逻辑值,指示是否应打印信息。
二、绘制基本的聚类热图
# # 创建一个 5 行的矩阵,元素是来自标准正态分布的随机数
mat <- matrix(rnorm(25), nrow = 5)
# 使用 heatmap 函数绘制热图
# mat 是要绘制的矩阵数据
heatmap(mat)
三、调整和美化
# 创建一个 5 行的矩阵,元素是来自标准正态分布的随机数
mat <- matrix(rnorm(25), nrow = 5)
# 定义一个颜色函数,使用颜色 "blue"、"white" 和 "red" 创建一个颜色渐变调色板
my_colors <- colorRampPalette(c("blue", "white", "red"))
# 为列侧边生成颜色向量,长度与矩阵的列数相同
col_side_colors <- my_colors(ncol(mat))
# 为行侧边生成颜色向量,长度与矩阵的行数相同
row_side_colors <- my_colors(nrow(mat))
# 使用 heatmap 函数绘制热图
# mat 是要绘制的矩阵数据
# col = my_colors(100) 设置热图的颜色调色板,使用前面定义的颜色函数生成 100 种颜色
# ColSideColors = col_side_colors 为列添加侧边栏颜色
# RowSideColors = row_side_colors 为行添加侧边栏颜色
# Colv = NA 表示不进行列的聚类
# cexRow = 1 设置行标签的字体大小为 1
# cexCol = 1.2 设置列标签的字体大小为 1.2
heatmap(mat, col = my_colors(100), ColSideColors = col_side_colors, RowSideColors = row_side_colors, Colv = NA, cexRow = 1, cexCol = 1.2)
0x02 使用pheatmap包
一、参数说明
-
1 主要输入数据参数
mat
:要绘制热图的数值矩阵。
-
2 颜色和断点参数
- 2.1
color
:用于热图的颜色向量。 - 2.2
kmeans_k
:若要在绘制热图前对行进行聚合,此为 kmeans 聚类的数量,若为NA
则不对行进行聚合。 - 2.3
breaks
:覆盖矩阵值范围的数字序列,比颜色向量长一个元素,用于将值映射到颜色,若为NA
则自动计算断点。
- 2.1
-
3 边框和单元格尺寸参数
- 3.1
border_color
:热图单元格边框的颜色,若为NA
则不绘制边框。 - 3.2
cellwidth
:单个单元格的宽度(以点为单位),若为NA
则取决于绘图窗口大小。 - 3.3
cellheight
:单个单元格的高度(以点为单位),若为NA
则取决于绘图窗口大小。
- 3.1
-
4 标准化和聚类参数
- 4.1
scale
:指示是否在行或列方向上对数值进行中心化和缩放,可选值为 “row”(行方向)、“column”(列方向)和 “none”(不进行)。 - 4.2
cluster_rows
和cluster_cols
:布尔值或层次聚类对象,决定是否对行和列进行聚类。 - 4.3
clustering_distance_rows
和clustering_distance_cols
:用于聚类行和列的距离度量,可以是 “correlation”(皮尔逊相关系数)或其他dist
函数支持的距离,若不是这些值则假定提供了距离矩阵。 - 4.4
clustering_method
:聚类方法,接受与hclust
相同的值。 - 4.5
clustering_callback
:回调函数,用于修改聚类,接受两个参数:原始层次聚类对象和用于聚类的矩阵,必须返回一个层次聚类对象。 - 4.6
cutree_rows
和cutree_cols
:基于层次聚类将行和列划分成的聚类数量。 - 4.7
treeheight_row
和treeheight_col
:若行和列进行聚类,则为树的高度,默认值为 50 点。
- 4.1
-
5 图例和注释参数
- 5.1
legend
:逻辑值,决定是否绘制图例。 - 5.2
legend_breaks
:图例的断点向量。 - 5.3
legend_labels
:图例断点的标签向量。 - 5.4
annotation_row
和annotation_col
:数据框,指定热图左侧和上方的注释,每行定义特定行或列的特征,通过相应的行名或列名与数据匹配。 - 5.5
annotation
:已弃用的参数,当前若annotation_col
缺失,则设置annotation_col
。 - 5.6
annotation_colors
:列表,用于手动指定注释轨道的颜色,可以只为部分特征定义颜色。 - 5.7
annotation_legend
:逻辑值,显示注释轨道的图例是否绘制。 - 5.8
annotation_names_row
和annotation_names_col
:逻辑值,显示行和列注释轨道的名称是否绘制。 - 5.9
drop_levels
:逻辑值,决定是否显示未使用的级别在图例中。
- 5.1
-
6 标签和显示参数
- 6.1
show_rownames
和show_colnames
:布尔值,指定是否显示行名和列名。 - 6.2
main
:绘图的标题。 - 6.3
fontsize
、fontsize_row
和fontsize_col
:字体大小。 - 6.4
angle_col
:列标签的角度,可以从几个预定义的选项中选择(0、45、90、270 和 315)。 - 6.5
display_numbers
:逻辑值,决定是否在单元格中打印数值,若为矩阵,则显示该矩阵的内容而不是原始值。 - 6.6
number_format
:数字显示的格式字符串(C 语言printf
风格)。 - 6.7
number_color
:数字文本的颜色。 - 6.8
fontsize_number
:单元格中显示数字的字体大小。
- 6.1
-
7 间隙和自定义标签参数
- 7.1
gaps_row
和gaps_col
:向量,用于在行和列中引入间隙,若行和列未聚类,则使用此参数,对于聚类的行和列,可以使用cutree_row
和cutree_col
引入间隙。 - 7.2
labels_row
和labels_col
:自定义的行和列标签,用于替代行名和列名。
- 7.1
-
8 文件输出参数
- 8.1
filename
:保存图片的文件路径,文件类型由路径中的扩展名决定,支持的格式有png
、pdf
、tiff
、bmp
、jpeg
。 - 8.2
width
和height
:手动指定输出文件的宽度和高度(以英寸为单位)。 - 8.3
silent
:逻辑值,不绘制图形(在使用gtable
输出时很有用)。
- 8.1
-
9 其他参数
扫描二维码关注公众号,回复: 17519155 查看本文章na_col
:指定矩阵中NA
单元格的颜色。
二、准备工作
# 安装 pheatmap 包,如果已经安装过可以省略这一步
install.packages("pheatmap")
# 加载 pheatmap 包以使用其函数
library(pheatmap)
#这里使用R语言内置数据mtcars作为演示,该数据提取自 1974 年的《Motor Trend》美国杂志,包含了 32 辆汽车(1973 - 1974 年车型)的燃油消耗以及汽车设计和性能的 10 个方面的数据。
# 将 mtcars 数据集转换为矩阵,并进行中心化和标准化处理
# as.matrix 将 mtcars 转换为矩阵形式,以便后续处理
# scale 函数对矩阵进行标准化,默认会进行中心化(减去均值)和除以标准差操作
data <- as.matrix(scale(mtcars))
# 定义一个颜色函数,使用颜色 "blue"、"white" 和 "red" 创建一个颜色渐变调色板
my_colors <- colorRampPalette(c("blue", "white", "red"))
三、绘制基本的聚类热图
使用pheatmap()
函数绘制基本的热图。
# 使用 pheatmap 函数绘制热图
# data 是经过处理后的矩阵数据,将其作为输入绘制热图
# 此热图将展示 mtcars 数据集中各变量在标准化处理后的数值分布和关系
pheatmap(data)
四、调整和美化
# 使用 pheatmap 函数绘制热图
# data 是经过处理后的矩阵数据,作为热图的输入
# treeheight_row = 140 设置行聚类树的高度为 140
# treeheight_col = 11 设置列聚类树的高度为 11(由于关闭了列聚类,此参数也不生效)
# cluster_cols = FALSE 不进行列聚类,即热图的列不会进行聚类操作
# color = my_colors(1000) 使用自定义的颜色函数 my_colors 生成 1000 种颜色用于热图的颜色映射
# border_color = NA 不绘制热图单元格的边框
# fontsize = 10 设置热图的基本字体大小为 10
# fontsize_row = 8 设置热图中行名的字体大小为 8
# display_numbers = TRUE 在热图的单元格中显示数值
pheatmap(data,
treeheight_row = 140,
treeheight_col = 11,
cluster_cols = FALSE,
color = my_colors(1000),
border_color = NA,
fontsize = 10,
fontsize_row = 8,
display_numbers = TRUE)