R语言——使用pheatmap包绘制热图

提到热图,大家应该都不陌生。在文献中,热图常通过将数值映射为颜色,利用颜色变化直观地展示基因在不同样本中的表达情况、基因与基因之间的相关性等等。那么,今天就给大家介绍一下如何使用pheatmap包来绘制热图。

1.安装并加载pheatmap包,并加载示例数据。

# 安装包

install.packages("pheatmap")

# 加载包

library(pheatmap)

# 加载数据

load("示例数据.rdata")

is.matrix(data)

绘制热图所需的数据结构是矩阵。这里的示例数据data就是一个行为基因,列为样本(T表示肿瘤样本,N表示正常样本)的10*10的矩阵(图1),中间的数值是每个基因在每个样本中表达的fpkm值。

图1

接下来,就可以使用pheatmap包中的pheatmap函数来画图了。我们先使用如下代码可以绘制一个相对简单的热图(图2)。

# 绘制热图

p1 <- pheatmap(data,  #要绘制热图的矩阵

               color = colorRampPalette(c('blue','white','red'))(100), #热图色块颜色是从蓝到红分为100个等级

               border_color = "black",  #热图中每个色块的边框颜色,NA表示无边框

               scale = "row", #按行进行归一化,"column"表示按列,"none"表示不进行归一化

               cluster_rows = FALSE, #是否对行进行聚类

               cluster_cols = FALSE, #是否对列进行聚类

               legend = TRUE, #是否显示图例

               legend_breaks = c(-1, 0, 1), #设置图例的断点

               legend_labels = c("low","","heigh"), #设置图例断点处的标签

               show_rownames = TRUE, #是否显示行名

               show_colnames = TRUE, #是否显示列名

               fontsize = 8 #字体大小,可以通过fontsize_row、fontsize_col参数分别设置行列名的字体大小

               )

pdf("热图1.pdf",width = 12,height = 8)

p1

dev.off()


图2

有几个问题需要注意一下:

①参数设置归一化方向。为什么要进行归一化呢?

我们前面介绍过,热图是利用颜色变化来直观地展示数值的变化。但如果绘制热图的数据差异过大,比如使用基因表达数据绘制热图,gene1在所有样本的表达量都在1000以上,gene2在所有样本的表达量都在1-10之间,由于数值之间相差过大,根本不在一个数量级上,那么在绘制热图时,两个基因在不同样本中表达的微小变化就很难通过颜色反映出来。所以,在绘制热图时,我们通常会对基因表达数据进行归一化,也就是将每一个基因表达量减去这个基因在所有样本中表达量的均值,然后除以其标准差,这种归一化的方式叫做标准正态化或Z-score处理。经过处理之后的数值都被等比例缩小了,每一个基因在所有样本的表达量就变成了均值为0,标准差为1的一组值。此时,绘制出来的热图就可以很好地展示所有基因在不同样本中表达的变化情况了。注意,如果某一个基因在所有样本中的表达量都相同,此时,由于标准差为0,不能作为分母,也就无法通过Z-score处理进行归一化,反映在热图上就是一整行或一整列灰色的色块。

②是按行还是按列归一化呢?

我们进行归一化的目的是将基因表达量拉到同一个数量级上。所以,行为基因,就按行进行归一化,列为基因,就按列进行。

③关于聚类(cluster_rows 、cluster_cols参数)。

在上述代码中,我们将cluster_rows 、cluster_cols 的都设置成FALSE,也就是不对热图的行、列进行聚类。而在默认情况下,pheatmap包会通过基因表达数据计算各个样本以及各个基因之间的欧氏距离,然后根据欧式距离对样本和基因进行聚类(如图3)。可以发现,图3中基因和样本的顺序被重排,表达模式相似的基因、样本被排在一起,而表达模式差异大的基因,就会远离。在某些情况下,我们只是需要使用热图来直观呈现基因在样本中表达的变化规律,并不希望改变基因和样本的顺序,那就需要把参数cluster_rows 、cluster_cols 的设置成FALSE,不再进行聚类。


图3

2.此外,我们还可以给热图添加注释信息。

首先,使用如下代码加载注释信息。

# 加载注释信息

load("列注释信息.rdata")

load("行注释信息.rdata")

如图4、5所示,分别是列注释信息anno_col与行注释信息anno_row,数据结构是数据框。


图4 列注释信息


图5 行注释信息

使用如下代码即可绘制出如图6所示的热图。

# 绘制热图

p2 <- pheatmap(data,  

               color = colorRampPalette(c('blue','white','red'))(100),

               border_color = "black",  

               scale = "row",

               cluster_rows = FALSE,

               cluster_cols = FALSE,

               legend = TRUE,

               legend_breaks = c(-1, 0, 1),

               legend_labels = c("low","","heigh"),

               show_rownames = TRUE,

               show_colnames = TRUE,

               fontsize = 8,

               annotation_row = anno_row,   #添加行注释信息

               annotation_col = anno_col,   #添加列注释信息

               annotation_legend = TRUE,    #是否显示注释信息图例

               annotation_names_row = TRUE, #是否显示行注释的名称

               annotation_names_col = TRUE  #是否显示列注释的名称

               )

pdf("热图2.pdf",width = 12,height = 8)

p2

dev.off()


图6

3.最后,我们还可以在热图上展示每一个色块对应的数值。

如图7,每个色块对应的经过归一化之后的数值都被标注在色块上了。


图7

代码如下:

# 绘制热图

p3 <- pheatmap(data,  

               color = colorRampPalette(c('blue','white','red'))(100),

               border_color = "black",  

               scale = "row",

               cluster_rows = FALSE,

               cluster_cols = FALSE,

               legend = TRUE,

               legend_breaks = c(-1, 0, 1),

               legend_labels = c("low","","heigh"),

               show_rownames = TRUE,

               show_colnames = TRUE,

               fontsize = 8,

               display_numbers = TRUE,  #是否显示每个色块对应的数值(经归一化后的数值)

               number_format = "%.2f",  #数值格式,%.2f表示保留小数点后两位,

#%.1e表示使用科学计数法并保留小数点后一位

               number_color = "black",  #设置数值颜色

               fontsize_number = 6     #设置数值的字体大小

               )

pdf("热图3.pdf",width = 12,height = 8)

p3

dev.off()

不仅如此,通过设置display_numbers为维度与绘制热图的数据data相同的矩阵,可以在色块上个性化显示各种信息。比如当某个基因在某个样本中表达量的fpkm值大于10的时候,在色块上显示“+”,否则什么都不显示,就可以通过如下代码创建一个矩阵(如图8),

#预先定义包含每个色块信息的矩阵

cell_1 <- matrix(ifelse(data > 10, "+", " "),nrow(data))


图8

然后再传递给display_numbers参数来实现(如图9)。

# 绘制热图

p4 <- pheatmap(data,  

               color = colorRampPalette(c('blue','white','red'))(100),

               border_color = "black",  

               scale = "row",

               cluster_rows = FALSE,

               cluster_cols = FALSE,

               legend = TRUE,

               legend_breaks = c(-1, 0, 1),

               legend_labels = c("low","","heigh"),

               show_rownames = TRUE,

               show_colnames = TRUE,

               fontsize = 8,

               display_numbers = cell_1,  #将预先定义的矩阵传递给display_numbers参数

               number_color = "black",

               fontsize_number = 6  

)

pdf("热图4.pdf",width = 12,height = 8)

p4

dev.off()


图9

今天的分享到这里就结束了,如果这期推文有帮助到你,就请点一个免费的赞吧,我们下期再见!

—END—

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

推荐阅读更多精彩内容