对于热图大家都熟悉,热图中的颜色表示值的大小。但前几天看到一个热图,里面的颜色含有两个维度的信息,专门有一个颜色的图注(非主图,而是热图里面的颜色说明),如下,横坐标表示D值的大小,纵坐标表示的P值,可以看出二维区域中不同位置的颜色,同时反应了D值和P值的信息。

找了很多工具和方法,都不太方便实现,或者不太容易控制颜色的分布。后来突然悟了,我可以自己生成这个图,从左到右反应的D值大小,两个颜色渐变,从上往下反应的是P值显著性,颜色越来越深。

2D颜色渐变的完整代码如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# nrow和显著性对应,最多是10e-15(对应15),10e-1对应1
nrow = 15
# ncol是横坐标的划分单元
ncol = 80
# 生成空的颜色矩阵
color.m = matrix(data = NA, nrow = nrow, ncol = ncol)

# 横着看颜色渐变,我取的是蓝色到红色,颜色的数目对应ncol
# 解决了横向颜色变化
base.color = colorRampPalette(c("blue", "red"))(ncol)
 
# 填颜色
for(nr in 1:nrow) {
    
  for(nc in 1:ncol){
        #### 用adjustcolor中的alpha.f调整颜色的透明度
        #### 这样显著性越小的,颜色越淡,加0.02为了不完全白色
        color.m[nr, nc] =  adjustcolor( base.color[nc], alpha.f = 1/nrow*(nr-1)+0.02)
  }    
}

########## 此时color.m里面的颜色和横纵坐标有关,下一步需要把颜色展示出来,使得heatmap显示颜色
color.m

# 获取唯一的颜色代码
unique_colors <- unique(as.vector(color.m))

# 创建一个数值矩阵,用于映射颜色代码
# pheatmap画图的数据,但里面的值将映射成颜色,对应color_map
numeric_matrix <- matrix(match(as.vector(color.m), unique_colors),
                         nrow = nrow(color.m), ncol = ncol(color.m))

# 创建自定义颜色映射
# 颜色的vector,vector的名与numeric_matrix中的value对应
color_map <- setNames(unique_colors, seq_along(unique_colors))

# 绘制热图
pheatmap::pheatmap(numeric_matrix,
         color = color_map, border_color = NA,
         cluster_rows = F, cluster_cols = F,
         show_colnames = FALSE, legend = F,
         show_rownames = FALSE)

然后根据自己的数据,提取对应的颜色,准备真实数据的颜色矩阵,再生成numeric_matrix和color_map来画图。

####################################################################

#版权所有 转载请告知 版权归作者所有 如有侵权 一经发现 必将追究其法律责任

#Author: Jason

#####################################################################