ComplexHeatmap:简单好看的热图样式

1. Preparing example data

pacman::p_load(dplyr,psych,circlize,ComplexHeatmap)

#### Generate Testing Data
dtA <- data.frame(matrix(rnorm(10*12),nrow = 10)) %>% setNames(paste0("A_",seq(12)))
dtB <- data.frame(matrix(rnorm(10*8 ),nrow = 10)) %>% setNames(paste0("B_",seq(8)))

#### Calculate Correlation Matrix
ct_dt <- corr.test(dtA, dtB, method = "pearson")
r_dat <- round(t(ct_dt[["r"]]),3)  #提取相关性系数矩阵;
p_dat <- round(t(ct_dt[["p"]]),5)   #提取检验P值矩阵;

#### Prepare P.sign Matrix
p_sign <- p_dat
p_sign[p_dat >=0     & p_dat < 0.001] <- "***"
p_sign[p_dat >=0.001 & p_dat < 0.01 ] <- "**"
p_sign[p_dat >=0.01  & p_dat < 0.05 ] <- "*"
p_sign[p_dat >=0.05  & p_dat <= 1   ] <- ""

2. Preparing Color Map

#### Color Interpolation
#### Color Interpolation
C_Blue    = colorRamp2(c(-0.88, 0, 0.88), c("#0f86a9", "white", "#FC8452")) ###Celadon Blue.
Y_Green   = colorRamp2(c(-0.88, 0, 0.88), c("#A5CC26", "white", "#FF7BAC")) ###Yellow-Green.
P_Blue    = colorRamp2(c(-0.88, 0, 0.88), c("#3FA9F5", "white", "#FF931E")) ###Picton Blue.
._Orange  = colorRamp2(c(-0.88, 0, 0.88), c("#ffa500", "white", "#B3A9EB")) ###Orange .
P_Green   = colorRamp2(c(-0.88, -0.58,0,0.58, 0.88), c("#002826", "#019f90", "white", "#ff8e2d", "#a45007")) ### Persian Green.
colorRamp

3、Drawing HeatMap

3.1 Add Correlation R_Values
Heatmap(r_dat, use_raster = T, raster_quality = 10, row_title = NULL,
        #### 聚类树样式
        cluster_columns = T,cluster_rows = T,
        clustering_method_rows = "ward.D2",clustering_method_columns = "ward.D2",
        column_dend_height = unit(1.5, "cm"),
        row_dend_width     = unit(1.5, "cm"),
        column_dend_gp     = gpar(col = "#0f86a9",lwd = 3),
        row_dend_gp        = gpar(col = "#0f86a9",lwd = 3),
        
        #### 行列名样式
        row_names_gp    = gpar(col = "#0f86a9", fontface = 2,fontsize = 12),row_names_side = "right",
        ###### 重设列名样式
        show_column_names = F, bottom_annotation = HeatmapAnnotation(
            text = anno_text(colnames(r_dat), rot = 0, just = "center",location = 0.8,
                             gp = gpar(col = "#0f86a9", fontface = 2,fontsize = 12)),
            annotation_height = max_text_width(colnames(r_dat))
        ),
        
        column_title = "Correlation Heatmap", column_title_side = "top",
        column_title_gp = gpar(fontsize = 20, fontface = 2, col = "grey10"),
        
        #### 热图本体分割样式
        row_split = 2, column_split = 2,  ### Chunk
        column_gap = unit(2, "mm"),row_gap = unit(2, "mm"),  ### Chunk间隔
        border_gp = gpar(col = "#0f86a9",lty = 1,lwd = 3),   ### Chunk外框
        
        #### 热图本体
        col = P_Green,
        rect_gp = gpar(col = "white", lwd = 4), ### 像素格外框
        # width =  unit(1.4*ncol(r_dat), "cm"),
        # height = unit(1.3*nrow(r_dat), "cm"),
        
        
        #### 热图图注样式
        heatmap_legend_param = list(
            at = c(-.88, 0, .88),
            
            title = "R",
            title_gp = gpar(col = "gray20",fontface = 2, fontsize = 15),
            title_position = "topleft",
            
            grid_width = unit(5, "mm"),
            legend_height = unit(4, "cm"),
            labels_gp = gpar(col = "gray20", fontsize = 15)
        ),
        
        #### 热图文本注释
        cell_fun = function(j, i, x, y, width, height, fill) {
            if(abs(r_dat[i, j]) > 0.5){
                grid.text(sprintf("%.2f", r_dat[i, j]), x, y,
                          gp = gpar(fontsize = 10,col = "black"))}
        }
)

unit() 函数用于创建一个单位对象,可以用于设置图形的大小、位置等参数。
关于其中 npcptin 单位的说明:

  • npc:normalized parent coordinates,相对于父页面的归一化坐标。npc 的取值范围是[0, 1],其中0表示在父页面的左边缘或下边缘,1表示父页面的右边缘或上边缘。例如,unit(0.5, "npc")表示置于父页面的中心位置。
  • pt:points,即磅(1/72英寸)。pt是常用的长度单位,用于表示字体大小、线条宽度等。
  • in:inches,即英寸。in是常用的长度单位,用于表示图形的大小、位置等,同概念的还有 mm、cm 等单位。

3.2 Add Correlation P_Sign
        #### 热图文本注释
        cell_fun = function(j, i, x, y, width, height, fill) {
            grid.text(p_sign[i, j], x, y, vjust = 0.7,
                      gp = gpar(fontsize = 20,col = "black"))
        }

3.3 Add Conditional +/- Sign
        #### 热图文本注释
        cell_fun = function(j, i, x, y, width, height, fill) {
            if(r_dat[i, j] > 0.5){
                grid.text("+", x, y,
                          gp = gpar(fontsize = 20,fontface = "plain",col="gray10"))
            }else if(r_dat[i, j] < -0.5){
                grid.text("-", x, y, vjust = 0.4,
                          gp = gpar(fontsize = 20,fontface = "plain",col="gray10"))
            }
        }

3.4 Decorate Row names

ht_name <- unique(grep("row_names",list_components(),value = T))
decorate_row_names(gsub("_row_names_.","",ht_name)[1],{
    grid.rect(gp = gpar(fill = "#FF000040"))
}, slice = 1)
decorate_row_names(gsub("_row_names_.","",ht_name)[1],{
    grid.rect(gp = gpar(fill = "#00FF0040"))
}, slice = 2)

3.4 Decorate Clustering Dend

ht_name <- unique(grep("row_names",list_components(),value = T))
# decorate_column_dend(gsub("_row_names_.","",ht_name)[1], {grid.yaxis(main = T,gp = gpar(col = "#0f86a9",lwd = 3))})
decorate_row_dend(gsub("_row_names_.","",ht_name)[1], {
    vp = current.viewport()
    xscale = vp$xscale
    grid.xaxis(main = F,at = xscale[2] - 0:2, label = 0:2,gp = gpar(col = "#0f86a9",lwd = 3))
}, slice = 1)

3.5 Add Top Annotation

        top_annotation  = HeatmapAnnotation(GROUP = anno_block(gp = gpar(fill = c("#81b29a","#ffe6a7"),col = "white"),
                                           labels = c("A-T1", "A-T2"), show_name = T,
                                           labels_gp = gpar(col = "black", fontface =2 ,fontsize = 15)),
                                           annotation_name_side = "left",
                                           annotation_name_gp = gpar(fontsize = 15,fontface =2,col = "#0f86a9"),
                                           annotation_name_offset = unit(0.01, "npc")

        
        )

3.6 Label Row/Column_Names with Color

#### Assign color for row/column_name's label
rowsN_col <- as.data.frame(cutree(amap::hcluster(r_dat, link = "mcquitty"),3)) %>% setNames("cluster") %>% 
        mutate(hex_col = plyr::mapvalues(cluster,c(1, 2, 3), c("#96e072",  "#db7c26","#3da35d")) )

colmN_col <- as.data.frame(cutree(amap::hcluster(t(r_dat), link = "ward"),2)) %>% setNames("cluster") %>% 
        mutate(hex_col = plyr::mapvalues(cluster,c(1, 2), c("#780116",  "#3e74ff")) )
-------------------------------------------
> rowsN_col
cluster hex_col
B_1       1 #96e072
B_2       2 #db7c26
B_3       2 #db7c26
B_4       1 #96e072
B_5       3 #3da35d
B_6       1 #96e072
B_7       2 #db7c26
B_8       3 #3da35d

-------------------------------------------
Heatmap(
        
        #****#
        row_names_gp    = gpar(col = rowsN_col[["hex_col"]], fontface = 2,fontsize = 12),row_names_side = "right",
        show_column_names = F, bottom_annotation = HeatmapAnnotation(
                text = anno_text(colnames(r_dat), rot = 0, just = "center",location = 0.8,
                                 gp = gpar(col = colmN_col[["hex_col"]], fontface = 2,fontsize = 13)),
                annotation_height = max_text_width(colnames(r_dat))
        )
        #****#
)

4、FORMAT to GGPLOT & SAVE

ht <-  Heatmap(***)
plt <- grid::grid.grabExpr(draw(ht))
ggplot2::ggsave(filename = "</FILE NAME/>.pdf",plot = plt ,width = 22,height = 8)

Reference

Chapter 6 Heatmap Decoration | ComplexHeatmap Complete Reference (jokergoo.github.io)
Most probably asked questions (bioconductor.org)
legend position · Issue #669 · jokergoo/ComplexHeatmap (github.com)
https://mp.weixin.qq.com/s/gk4qnnizn_b5a9G8djobvw
R语言- ComplexHeatmap 绘制复杂热图示例-阿里云开发者社区 (aliyun.com)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容