Heatmap(热图)大家肯定不陌生,在很多医学、自然科学发表的重量级论文中常见其踪影。使用heatmap可以非常容易展示多组分之间关系或相关性,也是基因表达、前后差异对比大数据关系展示较好的工具,其实啊,实际中只要是矩阵数据也许都合适拿heatmap来展示其内在关系。其实,heatmap还有蕴含着不少分析的秘诀。那么,高大上的heatmap是怎么实现的呢? 目前,热图的绘制可以通过在线软件、 PCORD、 python、R语言等方式实现,个人推荐还是R语言实现的比较便捷,而且能实现一些高级的分析功能。在浩如烟海的R平台中,有heatmap3包、gplot包、heatmaply包、pheatmap等包,(还不包括可以间接实现热图的ggplot2、lattice等包)可以实heatmap的绘制。今天与大家分享的是以美观、便捷与变化多样著称的pheatmap包。热图的绘制不仅是图形,还涉及数据整理与分析、高级分析与运用、色彩等方面。请跟着我们的脚步,经过八步很快你也可以成为驾驭heatmap的能手,做出属于你自己的热图。 sdfd 事不宜迟,首先我们应该有一套数据。我们以机器学习常用的Breast Cancer Wisconsin (Diagnostic) Data Set数据为例说明pheatmap的使用,此数据集是利用各类细胞活体取样诊断患者是否患有乳腺癌的数据集,具体的说明详见网页。 网址: http://archive.ics./ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29 pheatmap包的命令仅有一个pheatmap,但是包含几十个参数,基本可以把heatmap修个遍。 首先,heatmap不太适合数据量很大的矩阵,比如超过几百项,基本就看不清楚行或列的标识。因此,画heatmap最重要一步反而是数据提炼预处理,我们会根据实验的目的,把最想显示的数据进行预处理。 pheatmap(w1[,-10]) pheatmap(scale(w1[,-10])) #pheatmap可以接受方阵与矩阵的数量数据,不支持分类等数据(故此去掉第十列),因此比较灵活。注意第一张与第二张的差别,第二张进行了数据的标准化,缩小了数据的跨度,也可以使用内置的scale的命令进行行列标准化。 pheatmap默认的颜色是RColorBerry的'RdYlBu'配色包(配色,是R平台很有讲究的一个大坑),通过color命令,可以自己的调配更换自己的颜色,图例的变化也会根据颜色的取值进行变化。颜色调节让我们的热图看起来不一样(下文分别使用了连续色与不连续颜色展示)。 pheatmap(scale(w1[,-10]),color=heat.colors(100)) pheatmap(w1[,-10], color = colorRampPalette(c('green3', 'white', 'bisque'))(50)) pheatmap(scale(w1[,-10]),color=brewer.pal(7,'PuBuGn')) 图例也是很容易更改的,刚才在颜色调整的时候color = colorRampPalette(c('green3', 'white', 'bisque')),三种颜色可以对应低、中、高三段不同的数量。但更进一步图例的设定可以通过break、legend命令实现图例的变化。 pheatmap(scale(w1[,-10]),legend = FALSE) pheatmap(w1[,-10], cluster_row = FALSE, legend_breaks = -1:4, legend_labels = c('0','1e-4', '1e-3', '1e-2', '1e-1', '1')) pheatmap(scale(w1[,-10]),legend_breaks = c(0.5,1.5,2.5)) pheatmap可以控制是否显示行、列名称、聚类结果以及单元格大小。pheatmap(w1[,-10],cluster_rows = F,cluster_cols = F) #关闭行、列聚类结果 pheatmap(w1[,-10],show_rownames = F,cluster_rows = F) #不显示行标签与聚类结果 pheatmap(w1[,-10],show_colnames = F,cluster_cols = F,cellwidth =10,cellheight =10) #单元格大小可控,可调节图形的比例 数字或者符号显示也是论文常用的标注方法,尤其第二种方式,请大家细细体会。 pheatmap(w1[,-10], display_numbers = TRUE, number_format = '%.1e') pheatmap(w1[,-10], display_numbers =ifelse(w1[,-10] >1, 'A', '')) 在上面heatmap的分析中已经初步展示了行、列的聚类关系。聚类是Heatmap展示数据内部关系的一个重要方法,可以揭示数据之间潜在的关系。聚类在机器学习领域属于无监督学习的一类,其计算过程可分为数据处理、关系矩阵化与聚类方式三个部分。关系矩阵化是指把要聚类的数据转化为一个关系矩阵,最简单是采用欧氏距离法;在此基础上通过singlelinkage(单连动)、complete linkage(全联动)、average linkage(平均联动),ward等层次聚类或者K均值(K-mean)、围绕中心划分等(PAM)聚类方法进一步计算聚类树状图与分组。看起来很复杂,但在pheatmap里会自动完成大部分工作。 pheatmap可以通过clustering_distance_rows/cols控制聚类的方法。clustering_distance_rows/cols可以继承dist或其他公式计算关系矩阵,而clustering_method则用于控制聚类方式,两个命令配合可以实现各种不同聚类图的目的。 pheatmap(w1[,-10], colorRampPalette(brewer.pal(10, 'RdYlBu'))(256),kmeans_k = 2) # K-mean聚类,分多少个类与实验目的有关,此项研究分两类,但这个方法个人认为实现得不够好 pheatmap(w1[,-10], scale = 'row', clustering_distance_rows = 'correlation') #可以实现按行数据间皮尔逊相关性进行聚类 #当我们不满足默认的聚类方法时,可以用cluster_hclust或callback函数重排聚类 pheatmap还提供行、列的分组标注功能,可供分类探索与进一步按分组标注样品。先建立样品标签class1,class2 注意标注必须与原数据的行名与列名一致,本研究仅有class标注有意义,其他的class1、class2是模拟分组标签。 pheatmap(w1[,-10], annotation_row = ann_row,annotation_col = ann_col) 经过注释后可以形成多个分类的标注,此外利用ann_colors还可以自己分配分组的颜色,灵活性更大。 结 语 关于heatmap的实现,这里面只用到了最重要的部分代码,其实还有不少技巧可以深挖,有兴趣可以查看pheatmap函数的帮助文件,最重要的是自己去尝试,很快属于你自己特色的heatmap就随手可得。 到此,全文结束,有兴趣的同学还可以就聚类、自定义颜色与深度分析进行进一步的交流与探索。 附相关视频解析: |
|