美文网首页
玩转complexheatmap

玩转complexheatmap

作者: 深圳大学在读生信菜鸡 | 来源:发表于2023-03-28 20:30 被阅读0次

本系列是对ComplexeHeatmap包的学习笔记,部分内容根据自己的理解有适当的改动,但总体不影响原文。如有不明之处,以原文为准。原文请见:https://jokergoo.github.io/ComplexHeatmap-reference/book/

学习热图分割,行名/列名设置,热图的小格子自定义

构建数据

set.seed(123)##设置可重复性 nr1 = 4; nr2 = 8; nr3 = 6; nr = nr1 + nr2 + nr3 nc1 = 6; nc2 = 8; nc3 = 10; nc = nc1 + nc2 + nc3 mat = cbind(rbind(matrix(rnorm(nr1nc1, mean = 1, sd = 0.5), nr = nr1), matrix(rnorm(nr2nc1, mean = 0, sd = 0.5), nr = nr2), matrix(rnorm(nr3nc1, mean = 0, sd = 0.5), nr = nr3)), rbind(matrix(rnorm(nr1nc2, mean = 0, sd = 0.5), nr = nr1), matrix(rnorm(nr2nc2, mean = 1, sd = 0.5), nr = nr2), matrix(rnorm(nr3nc2, mean = 0, sd = 0.5), nr = nr3)), rbind(matrix(rnorm(nr1nc3, mean = 0.5, sd = 0.5), nr = nr1), matrix(rnorm(nr2nc3, mean = 0.5, sd = 0.5), nr = nr2), matrix(rnorm(nr3*nc3, mean = 1, sd = 0.5), nr = nr3)) )##生成数据 mat = mat[sample(nr, nr), sample(nc, nc)] # random shuffle rows and columns rownames(mat) = paste0("row", seq_len(nr)) colnames(mat) = paste0("column", seq_len(nc)) dim(mat) library(ComplexHeatmap)##加载R包

BiocManager::install('ComplexHeatmap')

heatmap(mat)##默认颜色是黄色的 library(circlize)## col_fun = colorRamp2(c(-2, 0, 2), c("green", "white", "red"))##-2--2截断值并且给颜色 col_fun(seq(-3, 3)) Heatmap(mat, name = "mat", col = col_fun)

Heatmap(mat, name = "mat", show_row_names = F, show_column_names = F)#不显示行名,列名 Heatmap(mat, name = "mat", row_names_centered = TRUE, column_names_centered = TRUE)#居中对齐

设置行名、列名(过长) mat2 = mat rownames(mat2)[1] = paste(c(letters, LETTERS), collapse = "") Heatmap(mat2, name = "mat", row_title = "default row_names_max_width")

修改行名,列名过长的问题 Heatmap(mat2, name = "mat", row_title = "row_names_max_width as length of a*", row_names_max_width = max_text_width( rownames(mat2), gp = gpar(fontsize = 12) )) #自定义行名/列名,可用于解决原始矩阵行名/列名不能有重复的问题,或使用特殊符号等: row_labels = structure(paste0(letters[1:24], 1:24), names = paste0("row", 1:24)) column_labels = structure(paste0(LETTERS[1:24], 1:24), names = paste0("column", 1:24)) row_labels Heatmap(mat, name = "mat", row_labels = row_labels[rownames(mat)], column_labels = column_labels[colnames(mat)]) Heatmap(mat, name = "mat", row_labels = expression(alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa, lambda, mu, nu, xi, omicron, pi, rho, sigma)) ##可能会用到的热图分割 Heatmap(mat, name = "mat", row_km = 2)##K-means方法分割行 Heatmap(mat, name = "mat", column_km = 3)#K-means方法分割列 Heatmap(mat, name = "mat", row_km = 2, column_km = 3)#行列一起

指定离散型变量分割 Heatmap(mat, name = "mat", row_split = rep(c("A", "B"), 9), column_split = rep(c("C", "D"), 12))

通过自己设置的矩阵框分割 Heatmap(mat, name = "mat", row_split = data.frame(rep(c("A", "B"), 9), rep(c("C", "D"), each = 9)))

刚好学习一下什么是factor(下面的例子看不出来,但是在单细胞的数据处理中可以看出因子水平往往用于亚群的区分,譬如生殖细胞和体细胞就属于不同的factor) Heatmap(mat, name = "mat", row_split = factor(rep(c("A", "B"), 9)), column_split = factor(rep(c("C", "D"), 12))) ##可以通过聚类树分割 Heatmap(mat, name = "mat", row_split = 2, column_split = 3)

设置行的聚类 dend = hclust(dist(mat)) dend = color_branches(dend, k = 2) Heatmap(mat, name = "mat", cluster_rows = dend, row_split = 2) #分割 split = data.frame(cutree(hclust(dist(mat)), k = 2), rep(c("A", "B"), 9)) Heatmap(mat, name = "mat", row_split = split)

上述会发现我们无法控制分割的顺序,也就是分割是由聚类来控制的

默认情况下,当把row_split/column_split设置为类别变量(向量或数据框)或设置row_km/column_km时,会对切片的平均值使用聚类,

以显示切片级别中的层次结构。在这种情况下,无法精确地控制切片的顺序,因为它是由切片的聚类控制的。

但是可以将cluster_row_slices或cluster_column_slices设置为FALSE以关闭切片聚类,然后就可以精确地控制切#片的顺序了。

如果没有切片聚类,则可以通过row_split/column_split中的每个变量的级别来控制每个切片的顺序(在这种情#况下,每个变量应该是一个因子)。

如果所有变量都是字符,则默认顺序为unique(row_split)或unique(column_split)。

Heatmap(mat, name = "mat", row_split = rep(LETTERS[1:3], 6), column_split = rep(letters[1:6], 4)) Heatmap(mat, name = "mat", row_split = factor(rep(LETTERS[1:3], 6), levels = LETTERS[3:1]), column_split = factor(rep(letters[1:6], 4), levels = letters[6:1]))

上面两个都没有能够很好的控制,这里的函数就可以 Heatmap(mat, name = "mat", row_split = factor(rep(LETTERS[1:3], 6), levels = LETTERS[3:1]), column_split = factor(rep(letters[1:6], 4), levels = letters[6:1]), cluster_row_slices = FALSE, cluster_column_slices = FALSE)

还可以做到分割标题 split = data.frame(rep(c("A", "B"), 9), rep(c("C", "D"), each = 9)) Heatmap(mat, name = "mat", row_split = split, row_title = "%s|%s") Heatmap(mat, name = "mat", row_split = split, row_title = "%s|%s", row_title_rot = 0)##标题角度正 Heatmap(mat, name = "mat", row_split = 2, row_title = "cluster_%s") #这就可以用的上 ##自定义自己的title Heatmap(mat, name = "mat", row_split = split, row_title = c("top_slice", "middle_top_slice", "middle_bottom_slice", "bottom_slice"), row_title_rot = 0) ##在小标题上面加上一个大标题 ht = Heatmap(mat, name = "mat", row_split = split, row_title = "%s|%s")

This row_title is actually a heatmap-list-level row title

draw(ht, row_title = "I am a row title")

去除标题 Heatmap(mat, name = "mat", row_split = split, row_title = NULL)

默认情况下标题顶部没有空间,现在我们增加4pt的空间

ht_opt$TITLE_PADDING = unit(c(4, 4), "points")#自由定义 Heatmap(mat, name = "mat", row_km = 2, row_title_gp = gpar(col = c("red", "blue"), font = 1:2), row_names_gp = gpar(col = c("green", "orange"), fontsize = c(10, 14)), column_km = 3, column_title_gp = gpar(fill = c("red", "blue", "green"), font = 1:3), column_names_gp = gpar(col = c("green", "orange", "purple"), fontsize = c(10, 14, 8))) #调整分割宽度 Heatmap(mat, name = "mat", row_km = 3, row_gap = unit(5, "mm")) Heatmap(mat, name = "mat", row_km = 3, row_gap = unit(c(2, 4), "mm"))##也可以不一样 Heatmap(mat, name = "mat", row_km = 2, column_km = 3, border = TRUE)##行列都有分割 ##尽管分割了,但是间隙为0 Heatmap(mat, name = "mat", row_km = 2, column_km = 3, row_gap = unit(0, "mm"), column_gap = unit(0, "mm"), border = TRUE) ##分割注释条(花里胡哨的) Heatmap(mat, name = "mat", row_km = 2, column_km = 3, top_annotation = HeatmapAnnotation(foo1 = 1:24, bar1 = anno_points(runif(24))), right_annotation = rowAnnotation(foo2 = 18:1, bar2 = anno_barplot(runif(18))) )

相关文章

网友评论

      本文标题:玩转complexheatmap

      本文链接:https://www.haomeiwen.com/subject/lqexddtx.html