R語言——使用pheatmap包繪制熱圖

提到熱圖强缘,大家應該都不陌生。在文獻中莲绰,熱圖常通過將數(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值。

圖1

接下來疫向,就可以使用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()


圖2

有幾個問題需要注意一下:

①參數(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损痰,不再進行聚類福侈。


圖3

2.此外,我們還可以給熱圖添加注釋信息卢未。

首先肪凛,使用如下代碼加載注釋信息堰汉。

# 加載注釋信息

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

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

如圖4、5所示显拜,分別是列注釋信息anno_col與行注釋信息anno_row衡奥,數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)框。


圖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.最后矮固,我們還可以在熱圖上展示每一個色塊對應的數(shù)值。

如圖7譬淳,每個色塊對應的經(jīng)過歸一化之后的數(shù)值都被標注在色塊上了档址。


圖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, ?#是否顯示每個色塊對應的數(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))


圖8

然后再傳遞給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()


圖9

今天的分享到這里就結(jié)束了阅懦,如果這期推文有幫助到你和二,就請點一個免費的贊吧,我們下期再見耳胎!

—END—

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惯吕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怕午,更是在濱河造成了極大的恐慌废登,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郁惜,死亡現(xiàn)場離奇詭異钳宪,居然都是意外死亡,警方通過查閱死者的電腦和手機扳炬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搔体,“玉大人恨樟,你說我怎么就攤上這事【尉悖” “怎么了劝术?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我养晋,道長衬吆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任绳泉,我火速辦了婚禮逊抡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘零酪。我一直安慰自己冒嫡,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布四苇。 她就那樣靜靜地躺著孝凌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪月腋。 梳的紋絲不亂的頭發(fā)上蟀架,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音榆骚,去河邊找鬼片拍。 笑死,一個胖子當著我的面吹牛寨躁,可吹牛的內(nèi)容都是我干的穆碎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼职恳,長吁一口氣:“原來是場噩夢啊……” “哼所禀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起放钦,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤色徘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后操禀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褂策,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年颓屑,在試婚紗的時候發(fā)現(xiàn)自己被綠了斤寂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡揪惦,死狀恐怖遍搞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情器腋,我是刑警寧澤溪猿,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布钩杰,位于F島的核電站,受9級特大地震影響诊县,放射性物質(zhì)發(fā)生泄漏讲弄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一依痊、第九天 我趴在偏房一處隱蔽的房頂上張望避除。 院中可真熱鬧,春花似錦抗悍、人聲如沸驹饺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赏壹。三九已至,卻和暖如春衔沼,著一層夾襖步出監(jiān)牢的瞬間蝌借,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工指蚁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菩佑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓凝化,卻偏偏與公主長得像稍坯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搓劫,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容