需求描述

我们在进行pancaner当中关于某个基因描差异表达结果描述的时候,经常是把连续性变量当作数值来直接进行热图绘制。但是也有先进行先设置成分类变量的进行绘图同时通过数字来进行进一步的注释。这样的好处其实是,控制了颜色的变化,有时候渐变的变化,不一定会看到很好颜色分布。变成分类之后,可以之后具体的颜色变化。例如下面这个:

figure

figure

输入文件

我们这里还是使用FigureYa97correlation当中的相关数据来进行演示

dat <- read.csv("correlation.csv")
head(dat)
##   gene    immune_cells         cor      p.value
## 1 SCOC             aDC  0.16959516 1.512476e-05
## 2 SCOC         B.cells -0.08246782 3.641187e-02
## 3 SCOC     CD8.T.cells  0.09887621 1.205683e-02
## 4 SCOC Cytotoxic.cells  0.28252253 2.772141e-13
## 5 SCOC              DC  0.07901581 4.502340e-02
## 6 SCOC     Eosinophils -0.09773162 1.309135e-02

数据转换

目前加载的数据是一个长数据,我们需要转换成宽数据来进行绘图.观察示例图片。我们需要准备两个数据框,一个是连续性变量的表达或者相关数据。另外一个是进行形成分类变量的数据框。

因此我们先形成一个相关系数的数据框和一个P值的数据框

library(tidyverse)
## ── Attaching packages ────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.1     ✔ purrr   0.3.2
## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
## ✔ tidyr   1.0.0     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ───────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
head5 <- function(dat) dat[1:5,1:5]
datCor <- dat %>% select(gene:cor) %>% 
    spread(key = immune_cells, value = cor) %>% 
    column_to_rownames(var = "gene")
head5(datCor)
##                  aDC     B.cells CD8.T.cells Cytotoxic.cells          DC
## ARHGAP31 -0.02823886  0.06134676  0.03516623    -0.052896536 -0.03727133
## FAM198B  -0.04582778 -0.04315052 -0.07920987    -0.063689149 -0.06060212
## GRAP2    -0.13982829 -0.07948684  0.04822977    -0.148208578 -0.24109542
## KIAA2026  0.05792983  0.22666557  0.14171547     0.076855813  0.21613036
## PNPT1     0.02169890 -0.20113160 -0.06995606    -0.004402053 -0.18594237
datP <- dat %>% select(gene:immune_cells, p.value) %>% 
    spread(key = immune_cells, value = p.value) %>% 
    column_to_rownames(var = "gene")
head5(datP)
##                  aDC      B.cells  CD8.T.cells Cytotoxic.cells
## ARHGAP31 0.474378914 1.198873e-01 0.3729502965    0.1800196715
## FAM198B  0.245507886 2.742098e-01 0.0444974886    0.1063650402
## GRAP2    0.000372199 4.375581e-02 0.2216063071    0.0001602191
## KIAA2026 0.141976175 5.997514e-09 0.0003090765    0.0512384889
## PNPT1    0.582558594 2.647987e-07 0.0760613630    0.9112237474
##                    DC
## ARHGAP31 3.450006e-01
## FAM198B  1.244565e-01
## GRAP2    5.715351e-10
## KIAA2026 3.029485e-08
## PNPT1    2.023985e-06

我们在相关系数和P值的基础上再形成一个分类变量

# 先对相关系数进行分组
datCorCat <- apply(datCor, 2, function(x){
    cut(x, breaks = c(-Inf, -0.3, -0.15, 0.15, 0.3, Inf),
        labels = c("< -0.3", "-0.3 - -0.15", "-0.15 - 0.15", "0.15 - 0.3", "> 0.3"))
    
})
# 对P < 0.05进行重新分组
datCorCat[datP >= 0.05] <- "P >= 0.05"
rownames(datCorCat) <- rownames(datCor)
head5(datCorCat)
##          aDC            B.cells        CD8.T.cells    Cytotoxic.cells
## ARHGAP31 "P >= 0.05"    "P >= 0.05"    "P >= 0.05"    "P >= 0.05"    
## FAM198B  "P >= 0.05"    "P >= 0.05"    "-0.15 - 0.15" "P >= 0.05"    
## GRAP2    "-0.15 - 0.15" "-0.15 - 0.15" "P >= 0.05"    "-0.15 - 0.15" 
## KIAA2026 "P >= 0.05"    "0.15 - 0.3"   "-0.15 - 0.15" "P >= 0.05"    
## PNPT1    "P >= 0.05"    "-0.3 - -0.15" "P >= 0.05"    "P >= 0.05"    
##          DC            
## ARHGAP31 "P >= 0.05"   
## FAM198B  "P >= 0.05"   
## GRAP2    "-0.3 - -0.15"
## KIAA2026 "0.15 - 0.3"  
## PNPT1    "-0.3 - -0.15"

设置自定义颜色

对于分类变量的自定义颜色。ComplexHeatmap需要一个向量来定义即可

col_cat <- c("> 0.3" = "#A80C3A", "0.15 - 0.3" = "#ED5E57", "-0.15 - 0.15" = "#DDD3D2",
             "-0.3 - -0.15" = "#6B9AB7", "< -0.3" = "#2F5B89", "P >= 0.05" = "white")

初步绘图

这样我们就可以进行初步的绘图了

library(ComplexHeatmap)
## Loading required package: grid
## ========================================
## ComplexHeatmap version 2.1.2
## Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
## Github page: https://github.com/jokergoo/ComplexHeatmap
## Documentation: http://jokergoo.github.io/ComplexHeatmap-reference
## 
## If you use it in published research, please cite:
## Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional 
##   genomic data. Bioinformatics 2016.
## ========================================
Heatmap(datCorCat, rect_gp = gpar(lwd = 1, col = "black"), col = col_cat)

文字注释

对于文字的注释,我们发现模式图当中的文字对于深颜色的使用了白色的字体,浅色的使用了黑色字体(模板图当中有一些深颜色还是使用了黑色字体,难道这个图说不准是使用AI自己一点儿一点儿画的?)。我们这里自定义一个呈现函数

cell_fun <- function(data, dataP, condtion1 = 0.15, condition2 = 0.05, darkcol = "black", lightcol = "white", digit = 2, fontsize  = 6){
    function(j, i, x, y, width, height, fill){
            if(abs(data[i,j]) > condtion1 & dataP[i,j] < condition2){
                grid.text(round(data, digit)[i, j], x, y, 
                          gp = gpar(fontsize = fontsize, col  = lightcol))
            }else{
                grid.text(round(data, digit)[i, j], x, y, 
                          gp = gpar(fontsize = fontsize, col  = darkcol))
            }
        }
}

最终画图

Heatmap(datCorCat, rect_gp = gpar(lwd = 1, col = "black"), col = col_cat,
        cell_fun = cell_fun(data = datCor, dataP = datP))