特别声明:本部分(系列)内容均来自顾祖光博士对ComplexHeatmap的介绍,仅为学习交流,尊重原创。
热图系列我们已经有:
今天分享:如何自定义热图行(列)名及顺序。
行(列)顺序(本部分主要包括:基于聚类结果的排序和完全自定义排序)
为了满足用户对行列顺序的自定义要求,ComplexHeatmap
提供了两种方案:基于聚类结果的排序和完全自定义排序。
-
基于聚类结果的排序
为什么有了聚类,你还会需要进行排序?需要注意的是,聚类只是将相似的行和列组合在了一起,在全局上可能并不会有比较好的效果,比如这个:
mat <- matrix(1:100, nr = 10, byrow = T)
Heatmap(matrix = mat, name = 'mat', row_dend_reorder = FALSE)
你会发现,即使相似的部分被聚在了一起,但还是存在不同颜色之间的交互,这个时候我们只需要通过
row_dend_reorder
和col_dend_reorder
参数即可实现调整:美观不少,这本身并没有改变聚类的结果,只是换了一种呈现的顺序而已,所以我把这种行列排列顺序的改变称为基于聚类结果的排序。
当然,ComplexHeatmap
完全考虑到了大家的需求,会默认将row_dend_reorder
和col_dend_reorder
设置为TRUE
,所以平时我们可以不用太关心这件事,但当出现意外结果时,最好还是能略知一二背后的原因。
-
完全自定义的排序
甚至有时候,你完全抛弃了聚类,想完全自己进行排序,当然ComplexHeatmap
也是支持的,当我们使用默认的排序方式时:
mat <- matrix(rnorm(400), nrow = 20)
colnames(mat) <- paste0('col_', c(10:20, 1:9))
rownames(mat) <- paste0('row_', 1:20)
Heatmap(matrix = mat, name = 'mat', cluster_rows = F, cluster_columns = F)
可以看到列名是乱的,完全遵从了原矩阵的列名,如果我们想自定义的话:
Heatmap(matrix = mat,
name = 'mat',
column_order = paste0('col_', 1:20),
cluster_rows = F,
cluster_columns = F)
通过column_order
参数指定一个你想要的顺序向量即可(行同理),还是很方便的,注意,这本身并没有改变你的数据,只是换了一个呈现的顺序而已:
行(列)名(这部分主要包括行列名细节调整,如角度、颜色等以及行列名的自定义)
-
行列名位置
一般来说,ComplexHeatmap
会默认将聚类树放在图的左边和上方,而把行列名放在右边和下方,而我们可以通过:
column_names_side
row_names_side
column_dend_side
row_dend_side
这几个参数就可以实现自定义位置。
mat <- matrix(rnorm(400), nrow = 20)
colnames(mat) <- paste0('col_', 1:20)
rownames(mat) <- paste0('row_', 1:20)
Heatmap(matrix = mat,
name = 'mat',
column_dend_side = 'bottom',#树放在下面
row_dend_side = 'right',#树放在右边
column_names_side = 'top',#列名放在上面
row_names_side = 'left')#行名放在左边
此外你还会注意到,行(列)名分别是靠边对齐的,例如上图中行名就是右对齐,列名就是下对齐,当然你也可以通过使用
row_names_centered
和column_names_centered
参数让它们变成居中对齐:
Heatmap(matrix = mat,
name = "mat",
row_names_centered = TRUE,
column_names_centered = TRUE)
有时候行(列)名太长,横着放或竖着放影响观感,一个办法就是让它旋转一下,这可以通过
column_names_rot
和row_names_rot
参数来实现:
Heatmap(matrix = mat,
name = 'mat',
column_names_rot = 45)
当然还有最后一个细节就是有时候行列名太长如何将其显示限制在一定范围内,这可以通过
row_names_max_width
和column_names_max_height
参数来实现,一般默认最大显示空间为6cm。
rownames(mat)[2] = paste(c(letters[1:15], LETTERS[1:15]), collapse = '')
Heatmap(matrix = mat,
name = 'mat',
row_names_max_width = unit(10, 'cm'))
这里我们调整成了10cm:
-
行(列)名颜色
行(列)名还有一个非常重要的属性就是颜色,这个很简单,下面这个例子就能说明问题了:
Heatmap(matrix = mat,
name = 'mat',
column_names_gp = gpar(col = c(rep('red', 10), rep('blue', 10))))
我们把前十个列名标记成红色,把后十个标记成蓝色:
当然这部分我更希望你记住的是,凡是对行列名字体属性本身进行的修改都可以通过
##_names_gp=gpar()
来实现修改,包括fontsize
(字大小)、fontface
(字体)等
-
行(列)名
这个需求来自于有的时候你可能并不像行列名显示为原数据矩阵的行列名,而想自己自定义一些标签(label)。这个也很简单,直接给row_labels
和column_labels
传递一个和原行列名等长的一个向量就可以了。
Heatmap(matrix = mat,
name = 'mat',
column_labels = LETTERS[1:20])
最终,原来的col_1被新的标签A代替了,col_2被新的标签B代替了,依此类推。注意,这仅仅只是改变了热图的显示哦,本身矩阵的信息并没有任何的改变。
网友评论