美文网首页基因组数据绘图
ComplexHeatmap:简单好看的热图样式

ComplexHeatmap:简单好看的热图样式

作者: 倪桦 | 来源:发表于2023-06-18 20:38 被阅读0次

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、EASY 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)

相关文章

网友评论

    本文标题:ComplexHeatmap:简单好看的热图样式

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