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()
函数用于创建一个单位对象,可以用于设置图形的大小、位置等参数。
关于其中 npc 、pt 和in 单位的说明:
- 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)
网友评论