对于热图大家都熟悉,热图中的颜色表示值的大小。但前几天看到一个热图,里面的颜色含有两个维度的信息,专门有一个颜色的图注(非主图,而是热图里面的颜色说明),如下,横坐标表示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
#####################################################################