提到熱圖强缘,大家應該都不陌生。在文獻中莲绰,熱圖常通過將數(shù)值映射為顏色欺旧,利用顏色變化直觀地展示基因在不同樣本中的表達情況、基因與基因之間的相關性等等蛤签。那么辞友,今天就給大家介紹一下如何使用pheatmap包來繪制熱圖。
1.安裝并加載pheatmap包,并加載示例數(shù)據(jù)称龙。
# 安裝包
install.packages("pheatmap")
# 加載包
library(pheatmap)
# 加載數(shù)據(jù)
load("示例數(shù)據(jù).rdata")
is.matrix(data)
繪制熱圖所需的數(shù)據(jù)結(jié)構(gòu)是矩陣留拾。這里的示例數(shù)據(jù)data就是一個行為基因,列為樣本(T表示腫瘤樣本鲫尊,N表示正常樣本)的10*10的矩陣(圖1)痴柔,中間的數(shù)值是每個基因在每個樣本中表達的fpkm值。
接下來疫向,就可以使用pheatmap包中的pheatmap函數(shù)來畫圖了咳蔚。我們先使用如下代碼可以繪制一個相對簡單的熱圖(圖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參數(shù)分別設置行列名的字體大小
???????????????)
pdf("熱圖1.pdf",width = 12,height = 8)
p1
dev.off()
有幾個問題需要注意一下:
①參數(shù)設置歸一化方向。為什么要進行歸一化呢囊嘉?
我們前面介紹過温技,熱圖是利用顏色變化來直觀地展示數(shù)值的變化。但如果繪制熱圖的數(shù)據(jù)差異過大扭粱,比如使用基因表達數(shù)據(jù)繪制熱圖舵鳞,gene1在所有樣本的表達量都在1000以上,gene2在所有樣本的表達量都在1-10之間琢蛤,由于數(shù)值之間相差過大系任,根本不在一個數(shù)量級上,那么在繪制熱圖時虐块,兩個基因在不同樣本中表達的微小變化就很難通過顏色反映出來。所以嘉蕾,在繪制熱圖時贺奠,我們通常會對基因表達數(shù)據(jù)進行歸一化,也就是將每一個基因表達量減去這個基因在所有樣本中表達量的均值错忱,然后除以其標準差儡率,這種歸一化的方式叫做標準正態(tài)化或Z-score處理。經(jīng)過處理之后的數(shù)值都被等比例縮小了以清,每一個基因在所有樣本的表達量就變成了均值為0儿普,標準差為1的一組值。此時掷倔,繪制出來的熱圖就可以很好地展示所有基因在不同樣本中表達的變化情況了眉孩。注意,如果某一個基因在所有樣本中的表達量都相同,此時浪汪,由于標準差為0巴柿,不能作為分母,也就無法通過Z-score處理進行歸一化死遭,反映在熱圖上就是一整行或一整列灰色的色塊广恢。
②是按行還是按列歸一化呢?
我們進行歸一化的目的是將基因表達量拉到同一個數(shù)量級上呀潭。所以钉迷,行為基因,就按行進行歸一化钠署,列為基因糠聪,就按列進行。
③關于聚類(cluster_rows 踏幻、cluster_cols參數(shù))枷颊。
在上述代碼中,我們將cluster_rows 该面、cluster_cols 的都設置成FALSE夭苗,也就是不對熱圖的行、列進行聚類隔缀。而在默認情況下题造,pheatmap包會通過基因表達數(shù)據(jù)計算各個樣本以及各個基因之間的歐氏距離,然后根據(jù)歐式距離對樣本和基因進行聚類(如圖3)猾瘸〗缗猓可以發(fā)現(xiàn),圖3中基因和樣本的順序被重排牵触,表達模式相似的基因淮悼、樣本被排在一起,而表達模式差異大的基因揽思,就會遠離袜腥。在某些情況下,我們只是需要使用熱圖來直觀呈現(xiàn)基因在樣本中表達的變化規(guī)律钉汗,并不希望改變基因和樣本的順序羹令,那就需要把參數(shù)cluster_rows 、cluster_cols 的設置成FALSE损痰,不再進行聚類福侈。
2.此外,我們還可以給熱圖添加注釋信息卢未。
首先肪凛,使用如下代碼加載注釋信息堰汉。
# 加載注釋信息
load("列注釋信息.rdata")
load("行注釋信息.rdata")
如圖4、5所示显拜,分別是列注釋信息anno_col與行注釋信息anno_row衡奥,數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)框。
使用如下代碼即可繪制出如圖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()
3.最后矮固,我們還可以在熱圖上展示每一個色塊對應的數(shù)值。
如圖7譬淳,每個色塊對應的經(jīng)過歸一化之后的數(shù)值都被標注在色塊上了档址。
代碼如下:
# 繪制熱圖
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, ?#是否顯示每個色塊對應的數(shù)值(經(jīng)歸一化后的數(shù)值)
???????????????number_format = "%.2f", ?#數(shù)值格式,%.2f表示保留小數(shù)點后兩位邻梆,
#%.1e表示使用科學計數(shù)法并保留小數(shù)點后一位
???????????????number_color = "black", ?#設置數(shù)值顏色
???????????????fontsize_number = 6 ????#設置數(shù)值的字體大小
???????????????)
pdf("熱圖3.pdf",width = 12,height = 8)
p3
dev.off()
不僅如此守伸,通過設置display_numbers為維度與繪制熱圖的數(shù)據(jù)data相同的矩陣,可以在色塊上個性化顯示各種信息浦妄。比如當某個基因在某個樣本中表達量的fpkm值大于10的時候尼摹,在色塊上顯示“+”,否則什么都不顯示剂娄,就可以通過如下代碼創(chuàng)建一個矩陣(如圖8)蠢涝,
#預先定義包含每個色塊信息的矩陣
cell_1 <- matrix(ifelse(data > 10, "+", " "),nrow(data))
然后再傳遞給display_numbers參數(shù)來實現(xiàn)(如圖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參數(shù)
???????????????number_color = "black",
???????????????fontsize_number = 6 ?
)
pdf("熱圖4.pdf",width = 12,height = 8)
p4
dev.off()
今天的分享到這里就結(jié)束了阅懦,如果這期推文有幫助到你和二,就請點一個免費的贊吧,我們下期再見耳胎!
—END—