跟著Nature Methods學(xué)畫圖:R語言畫熱圖(pheatmap)展示基因表達(dá)量

在簡書 土豆學(xué)生信 分享的內(nèi)容看到這篇論文 簡書的鏈接是 http://www.reibang.com/p/bbf9cb13b41a

論文是


image.png

論文對應(yīng)的代碼是公開的 https://github.com/ajwilk/2020_Wilk_COVID

image.png

在學(xué)習(xí)他這個代碼的時候發(fā)現(xiàn)其中自定義了一個函數(shù)可以操作熱圖的文字標(biāo)簽税娜,可以讓熱圖上只顯示我們感興趣的文字標(biāo)簽。

我在運行這個代碼的時候遇到了報錯,沒有把代碼完全運行完,但是已經(jīng)獲得和NK.markers這個表達(dá)量文件舱呻,部分內(nèi)容如下

image.png

我們用這個表達(dá)量文件先做一個簡單的熱圖

讀入數(shù)據(jù)
df<-read.csv("NM/NK_markers_1.csv",header=T,row.names = 1)
head(df)
最簡單的熱圖
library(pheatmap)
pdf(file = "NM/hp-1.pdf",width = 4,height = 10)
pheatmap(df,fontsize = 3)
dev.off()
image.png

我們可以看到上圖右側(cè)所有的基因名都顯示出來了,如果我們想只顯示自己感興趣的嚷炉,那該如何實現(xiàn)呢捅厂?可以用開頭提到的自定義函數(shù)

add.flag <- function(pheatmap,
                     kept.labels,
                     repel.degree) {
  
  # repel.degree = number within [0, 1], which controls how much 
  #                space to allocate for repelling labels.
  ## repel.degree = 0: spread out labels over existing range of kept labels
  ## repel.degree = 1: spread out labels over the full y-axis
  
  heatmap <- pheatmap$gtable
  
  new.label <- heatmap$grobs[[which(heatmap$layout$name == "row_names")]] 
  
  # keep only labels in kept.labels, replace the rest with ""
  new.label$label <- ifelse(new.label$label %in% kept.labels, 
                            new.label$label, "")
  
  # calculate evenly spaced out y-axis positions
  repelled.y <- function(d, d.select, k = repel.degree){
    # d = vector of distances for labels
    # d.select = vector of T/F for which labels are significant
    
    # recursive function to get current label positions
    # (note the unit is "npc" for all components of each distance)
    strip.npc <- function(dd){
      if(!"unit.arithmetic" %in% class(dd)) {
        return(as.numeric(dd))
      }
      
      d1 <- strip.npc(dd$arg1)
      d2 <- strip.npc(dd$arg2)
      fn <- dd$fname
      return(lazyeval::lazy_eval(paste(d1, fn, d2)))
    }
    
    full.range <- sapply(seq_along(d), function(i) strip.npc(d[i]))
    selected.range <- sapply(seq_along(d[d.select]), function(i) strip.npc(d[d.select][i]))
    
    return(unit(seq(from = max(selected.range) + k*(max(full.range) - max(selected.range)),
                    to = min(selected.range) - k*(min(selected.range) - min(full.range)), 
                    length.out = sum(d.select)), 
                "npc"))
  }
  new.y.positions <- repelled.y(new.label$y,
                                d.select = new.label$label != "")
  new.flag <- segmentsGrob(x0 = new.label$x,
                           x1 = new.label$x + unit(0.15, "npc"),
                           y0 = new.label$y[new.label$label != ""],
                           y1 = new.y.positions)
  
  # shift position for selected labels
  new.label$x <- new.label$x + unit(0.2, "npc")
  new.label$y[new.label$label != ""] <- new.y.positions
  
  # add flag to heatmap
  heatmap <- gtable::gtable_add_grob(x = heatmap,
                                     grobs = new.flag,
                                     t = 4, 
                                     l = 4
  )
  
  # replace label positions in heatmap
  heatmap$grobs[[which(heatmap$layout$name == "row_names")]] <- new.label
  
  # plot result
  grid.newpage()
  grid.draw(heatmap)
  
  # return a copy of the heatmap invisibly
  invisible(heatmap)
}

將以上函數(shù)放到文本文件里,通過source()加載這個函數(shù)

source("useful_R_function/add_flag.r")

選擇感興趣的基因名爷耀,我這里就隨機選取幾個了

gene_name<-sample(rownames(df),10)

畫圖

source("useful_R_function/add_flag.r")
library(grid)
gene_name<-sample(rownames(df),10)
p1<-pheatmap(df)
add.flag(p1,
         kept.labels = gene_name,
         repel.degree = 0.2)

結(jié)果就變成了如下


image.png
接下來是簡單的美化

代碼

source("useful_R_function/add_flag.r")
df<-read.csv("NM/NK_markers_1.csv",header=T,row.names = 1)
head(df)
library(pheatmap)
library(grid)
gene_name<-sample(rownames(df),10)
paletteLength <- 100
mycolor<-colorRampPalette(c("blue","white","red"))(100)
mycolor
myBreaks <- unique(c(seq(min(df), 0, length.out=ceiling(paletteLength/2) + 1), 
                     seq(max(df)/paletteLength, max(df),
                         length.out=floor(paletteLength/2))))
p1<-pheatmap(df,color = mycolor,breaks = myBreaks)
pdf(file = "NM/hp-2.pdf",width = 4,height = 8)
add.flag(p1,
         kept.labels = gene_name,
         repel.degree = 0.2)
dev.off()
image.png

這個圖和開頭提到的論文里的Figure3f就有幾分相似了甘桑,但是還沒有添加分組信息

歡迎大家關(guān)注我的公眾號
小明的數(shù)據(jù)分析筆記本

小明的數(shù)據(jù)分析筆記本 公眾號 主要分享:1、R語言和python做數(shù)據(jù)分析和數(shù)據(jù)可視化的簡單小例子歹叮;2跑杭、園藝植物相關(guān)轉(zhuǎn)錄組學(xué)、基因組學(xué)咆耿、群體遺傳學(xué)文獻閱讀筆記德谅;3、生物信息學(xué)入門學(xué)習(xí)資料及自己的學(xué)習(xí)筆記萨螺!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窄做,一起剝皮案震驚了整個濱河市愧驱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椭盏,老刑警劉巖组砚,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庸汗,居然都是意外死亡惫确,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門蚯舱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改化,“玉大人,你說我怎么就攤上這事枉昏〕赂兀” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵兄裂,是天一觀的道長句旱。 經(jīng)常有香客問我,道長晰奖,這世上最難降的妖魔是什么谈撒? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮匾南,結(jié)果婚禮上啃匿,老公的妹妹穿的比我還像新娘。我一直安慰自己蛆楞,他們只是感情好溯乒,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豹爹,像睡著了一般裆悄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臂聋,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天光稼,我揣著相機與錄音,去河邊找鬼孩等。 笑死艾君,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞎访。 我是一名探鬼主播腻贰,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吁恍,長吁一口氣:“原來是場噩夢啊……” “哼扒秸!你這毒婦竟也來了播演?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伴奥,失蹤者是張志新(化名)和其女友劉穎写烤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拾徙,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡洲炊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尼啡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暂衡。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖崖瞭,靈堂內(nèi)的尸體忽然破棺而出狂巢,到底是詐尸還是另有隱情,我是刑警寧澤书聚,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布唧领,位于F島的核電站,受9級特大地震影響雌续,放射性物質(zhì)發(fā)生泄漏斩个。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一驯杜、第九天 我趴在偏房一處隱蔽的房頂上張望受啥。 院中可真熱鬧,春花似錦艇肴、人聲如沸腔呜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽核畴。三九已至,卻和暖如春冲九,著一層夾襖步出監(jiān)牢的瞬間谤草,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工莺奸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丑孩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓灭贷,卻偏偏與公主長得像温学,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甚疟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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