利用ComplexHeatmap绘制热图(一)

作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源。

之前热图三部曲介绍了使用ggplot2和pheatmp绘制热图

R语言学习 - 热图绘制 (heatmap)

R语言学习 - 热图美化

R语言学习 - 热图简化

后来2017年最后学习1010个热图绘制方法简略介绍了10种热图绘制方式,CIRCOS增加热图、点图、线图和区块属性是另一种形式的热图。当然最简单的还是使用高颜值可定制在线绘图工具-第三版直接在线绘制。

知识学杂了也可以融会贯通,下面看看的Complexheatmap绘图逻辑,应该会对理解数据、图形、程序有些新的体会。

简介

Complexheatmap是由DKFZ的顾祖光博士创建的绘制热图的R包,基于绘图系统grid,因此如果有相应grid的知识,学习起来应该更顺手。在他的GitHub有十分详细的说明

(https://github.com/jokergoo/ComplexHeatmap)。

设计

Complexheatmap提供了一套非常灵活的方法用于多热图也就是热图列表布局以及支持自定义注释绘图,一个热图列表包含若干热图以及注释信息。

绘制单个热图

安装

包的安装就不细说了,R语言学习 - 基础概念和矩阵操作中有详细的教程,下面直接给出安装代码。

# installed from bioconductor
source("http://bioconductor.org/biocLite.R")
options(BioC_mirror="http://mirrors.ustc.edu.cn/bioc/")
biocLite("ComplexHeatmap")

# 或者直接从Github安装
# installed from GitHub
if(!require(devtools)){install.packages("devtools")}
devtools::install_github("jokergoo/ComplexHeatmap")

创建数据集

# pacman::p_load加载包,若不存在会自动安装
# 用在这不太合适,因为这个包是bioconductor的包,自动安装是调用install.packages,
# 具体没测试,可能会失败

pacman::p_load(ComplexHeatmap, circlize)

# 设置随机数种子,保证随机数据一致
set.seed(7)
mat <- cbind(rbind(matrix(rnorm(16, -1),4), matrix(rnorm(32, 1), 8)), rbind(matrix(rnorm(24, 1), 4), matrix(rnorm(48, -1), 8)))
mat <- mat[sample(nrow(mat), nrow(mat)), sample(ncol(mat), ncol(mat))]
rownames(mat) <- paste0("R", 1:12)
colnames(mat) <- paste0("C", 1:10)
# 常规矩阵就可以
mat

绘图

ComplexHeatmap绘制热图十分简单,使用默认参数

# 大写的H
Heatmap(mat)

定制化

ComplexHeatmap十分灵活,可以自定义多种参数绘制热图。

颜色

大多数情况下,绘制热图的矩阵都是连续性变量,通过提供颜色映射函数,我们可以自定义颜色,颜色选择和搭配见史上最全的图表色彩运用原理。这主要是通过circlize包中的colorRamp2()函数来实现的。

mat2 <- mat
mat2[1,1] <- 100000
# 设置颜色,并且不做行列聚类
Heatmap(mat2, col = colorRamp2(c(-3,0,3), c("green","white","red")), cluster_rows = FALSE, cluster_columns = FALSE)

试试彩虹色

Heatmap(mat, col = rev(rainbow(10)))

如果是离散型变量或者数值型当做离散数据、字符型变量的话,这时就需要特别指定颜色了

#离散型变量/数值型变量
discrete_mat <- matrix(sample(1:4, 100, replace = TRUE), 10, 10)
colors <- structure(circlize::rand_color(4), names=c("1","2","3","4"))
Heatmap(discrete_mat, col = colors)
#字符型变量
character_mat <- matrix(sample(letters[1:4], 100, replace = TRUE), 10, 10)
colors <- structure(circlize::rand_color(4), names=letters[1:4])
Heatmap(character_mat, col = colors)

可以看出,对于数值型变量,默认对行/列进行聚类,而对于字符型变量,则不进行聚类。

ComplexHeatmap允许数据中含有NA,只需要通过参数na_col来控制NA的颜色。

mat_with_NA <- mat
mat_with_NA[sample(c(TRUE, FALSE), nrow(mat)*ncol(mat), replace = TRUE, prob = c(1,9))] <- NA
Heatmap(mat_with_NA, na_col = "orange", clustering_distance_rows = "pearson")

ComplexHeatmap默认使用LAB颜色空间(LAB color space),colorRamp2()提供了选择颜色空间的参数选项

f1 <- colorRamp2(seq(min(mat), max(mat), length=3), c("blue","#EEEEEE", "red"))
f2 <- colorRamp2(seq(min(mat), max(mat), length=3), c("blue","#EEEEEE", "red"), space = "RGB")
H1 <- Heatmap(mat, col = f1, column_title = "LAB color space")
H2 <- Heatmap(mat, col = f2, column_title = "RGB color space")
H1+H2

ComplexHeatmap提供了多种颜色空间选项,可以根据自身数据不断调整,选取合适的颜色空间。

标题

一个热图的标题有:图标题、图例标题、行列标题等, Heatmap里提供的name参数默认的是图例的标题

Heatmap(mat, name = "legend")

图例标题也可以通过heatmap_legend_param()进行修改

Heatmap(mat, heatmap_legend_param = list(title="legend"))

行列标题

Heatmap(mat, name = "legend", column_title = "Column", row_title = "Row")
Heatmap(mat, name = "legend", column_title = "Column", column_title_side = "bottom")

如果需要修改字体、字号,可以通过gpar()参数

Heatmap(mat, name = "legend",column_title = "Column", row_title = "Row", column_title_gp = gpar(fontsize=20, fontface="bold"), row_title_gp = gpar(fontsize=20, fontface="bold"))

标题可以旋转(水平或竖直)

Heatmap(mat, name = "legend", row_title = "Row", row_title_rot = 0)

SessionInfo

sessionInfo()


## R version 3.4.4 (2018-03-15)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 16299)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Chinese (Simplified)_China.936 
## [2] LC_CTYPE=Chinese (Simplified)_China.936   
## [3] LC_MONETARY=Chinese (Simplified)_China.936
## [4] LC_NUMERIC=C                              
## [5] LC_TIME=Chinese (Simplified)_China.936    
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
## [1] circlize_0.4.3        ComplexHeatmap_1.17.1
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.16         digest_0.6.15        rprojroot_1.3-2     
##  [4] backports_1.1.2      pacman_0.4.6         magrittr_1.5        
##  [7] evaluate_0.10.1      GlobalOptions_0.0.13 stringi_1.1.7       
## [10] GetoptLong_0.1.6     rmarkdown_1.9        RColorBrewer_1.1-2  
## [13] rjson_0.2.15         tools_3.4.4          stringr_1.3.0       
## [16] yaml_2.1.18          compiler_3.4.4       colorspace_1.3-2    
## [19] shape_1.4.4          htmltools_0.3.6      knitr_1.20

原文发布于微信公众号 - 生信宝典(Bio_data)

原文发表时间:2018-10-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏崔庆才的专栏

滑动宫格验证码都给碰上了?没事儿,看完此文分分钟拿下!

27450
来自专栏AI研习社

如何使用 OpenCV 编写基于 Node.js 命令行界面和神经网络模型的图像分类

如何使用 OpenCV 编写基于 Node.js 命令行界面和神经网络模型的图像分类

23350
来自专栏非典型技术宅

Quartz2D进行渲染1. 渲染模式2. even-odd rule:奇偶填充规则3. nonzero winding number rule:非零绕数规则4. 其他会用到的渲染模式5. 混合模式

14430
来自专栏阮一峰的网络日志

关于Lorem ipsum

Wikipedia上的解释是,这只是一段用来测试排版效果的占位文字,没有实际的含义。据说,16世纪的时候就有人开始用了。当时的某个印刷工人,从古罗马政治家西塞罗...

17910
来自专栏逍遥剑客的游戏开发

挑战蓝龙Kalecgos

11920
来自专栏HT

HTML5五种客户端离线存储方案

最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie、WebS...

25860
来自专栏阿炬.NET

FineUIMvc表格数据库分页,使用CYQ.Data组件

42380
来自专栏IMWeb前端团队

前端识别验证码思路分析

相信很多前端同学对于二维码识别、图像对比等这类高大上的图像识别技术望而生畏,觉得此类识别技术只能通过更加底仓的高级语言才能实现(诸如c等),本文试图从前端的角度...

21070
来自专栏落影的专栏

Metal入门教程(五)视频渲染

Metal入门教程(一)图片绘制 Metal入门教程(二)三维变换 Metal入门教程(三)摄像头采集渲染 Metal入门教程(四)灰度计算

77060
来自专栏五毛程序员

五毛的cocos2d-x学习笔记03-控件

21550

扫码关注云+社区

领取腾讯云代金券