R数据可视化5:热图Heatmap

最近休息了几天。没有来得及更新。今天我们来讲一讲热图怎么绘制

什么是热图(Heatmap)

热图是一个以颜色变化来显示数据的矩阵。Toussaint Loua在1873年就曾使用过热图来绘制对巴黎各区的社会学统计。

Toussaint Loua: 社会学统计

生物学中热图经常用于展示多个基因在不同样本中的表达水平。然后可以通过聚类等方式查看不同组(如疾病组和对照组)特有的pattern。

基因表达

如上图每一列代表一个样本(左侧的样本是Basal,右侧的样本是Luminal),每一行代表一个基因,颜色代表了表达量(这张图没有显示图例,不知道是偏绿还是偏红代表高表达量)。可以看到这些挑选出的基因在两组的表达有较大的差异,EN1、FOXC1这几个基因在Basal组总体呈现红色,在Luminal呈现绿色。而后面的几个基因在Luminal总体呈现红色,在Basal总体呈现绿色。而外面的树状图形是对基因和样本的聚类,通常聚类的结果把基因的表达量相似的聚在一起,把基因表达的pattern相似的样本聚在一起。所以在该图中可以看到Basal的样本都聚在了一起,Luminal 的样本也都聚在了一起。通常如果两组的差异较明显,组内的pattern较为相似,就能有这样的聚类结果——一个组的样本聚类在一起。相反如果是差异较小的两组样本,就很可能混在一起。

热图还可以用于展示其他物质的丰度比如微生物的相对丰度、代谢组不同物质的含量等等。当然,另一个热图的重要用处就是展现不同指标、不同样本等之间的相关性

相关性热图

此时颜色代表的就是相关系数的大小。所以可以看到自己和自己的相关系数是1,也就是最深的蓝色。约接近白色说明相关性越弱,偏蓝(正相关)或者偏红(负相关)则代表相关性强。当然在相关性的计算中除了相关系数以外,我们还会看pvalue是否显著。如果我们想要把pvalue表示在图中,可以在格子上添加*号或者具体的数值。同时因为这里可以看到其实不同的两个指标之间的关系是被重复展现了2次,比如symboling与normalized-losses(最上面一行的第二个格子,和从上往下的第二行的第一个格子),因此有时候我们只展现一半即对角线以上或以下的一半图形。

相关性的热图: 格子中的数值代表相关性系数

怎么做热图Heatmap

1)需要什么格式的数据
有很多的软件都可以做heatmap。我们要介绍的当然是R,R默认中提供了heatmap函数。当然,R中也有很多具有heatmap功能的包,比如ggplot2,gplots。
今天我们介绍含有heatmap.2功能的gplots包。
heatmap.2函数和我们之前要求的数据类型不太一样,这个函数输入数据要求是个矩阵(matrix)。

data(mtcars)
x<-mtcars
y<-as.matrix(mtcars)

在R Studio中我们可以清楚的看到x和y的区别(虽然如果点开你也许会觉得x与y难道不是一模一样吗),x的type是dataframe的格式,而y是matrix也就是矩阵格式。这两种数据类型有什么差别呢?matrix中的值只能是一个格式,比如都是字符型。而dataframe可以同时支持不同的类型比如数值型和字符型。

dataframe与matrix

2)如何做图
本节用一个不是那么生物的数据集来展示一下如何做热图。

data("attitude")
Ca <- cor(attitude)
Ca数据

如果直接使用默认的heatmap.2功能我们可以看到:


默认

和平时看到的heatmap有些不一样,中间的这些蓝色的线我们称作“trace”:虚线表示这一列平均值,实线表示与平均值的偏离程度。默认是按照列计算平均等,也可以改为行。
但是我们这里的数据是做相关性,所以这些线的意义就不是那么大。
图例中也类似,展示了不同颜色对应的值大小,而蓝色的实线是根据数据分布做的密度曲线,虚线是平均值。
黑色的线之前我们已经提到过是对数据进行了聚类。

然后我们对图进行一些修改,红色太扎眼换个颜色,把一些不需要的功能去掉。比如聚类比如这些蓝色的线。


data("attitude")
Ca <- cor(attitude)#cor的结果就是矩阵

library(gplots)
library(RColorBrewer)
coul <- colorRampPalette(brewer.pal(8, "PiYG"))(25)#换个好看的颜色
hM <- format(round(Ca, 2))#对数据保留2位小数

heatmap.2(Ca,
trace="none",#不显示trace
col=coul,#修改热图颜色
density.info = "none",#图例取消density
key.xlab ='Correlation',
key.title = "",
cexRow = 1,cexCol = 1,#修改横纵坐标字体
Rowv = F,Colv = F, #去除聚类
margins = c(6, 6),
cellnote = hM,notecol='black'#添加相关系数的值及修改字体颜色
            )


当然也可以按照相同顺序把相关性系数换成pvalue。颜色也可以根据情况进行修改。其他的也可以进一步调整。
总之,要记住不论做什么图最最重要的是如何通过这张图说明突出你想要传达的内容,你想要告诉读者什么结论,那么就是你这张图所需要展示的,千万不要一味追求图形的好看或者复杂而忘记了你做图的目的,不论任何形式的图都只是数据的可视化,而可视化是为了增强数据的可读性。
借用老板常说的一句话,做生信的,要玩方法不要被方法玩。

另外,最近发现一篇基于pheatmap的热图文章,写的很详尽,推荐给大家:
使用pheatmap包绘制热图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容