ggplot的熱圖玩法

背景

畫熱圖的體系用的比較多的是pheatmap和ComplexHeatmap這兩個(gè)包,前者勝在代碼簡(jiǎn)單奔脐,功能強(qiáng)大俄周,而后者勝在細(xì)節(jié)無窮無盡吁讨,只有你想不到,沒有它做不到峦朗。
ggplot2在畫熱圖這件事上建丧,是存在感不太強(qiáng)的。但有時(shí)候還必須得用它來畫波势,以期和其他ggplot2的圖嚴(yán)絲合縫的拼在一起翎朱。

因此我收集了一下ggplot2的成果,發(fā)現(xiàn)又解鎖了y叔的一個(gè)新包aplot尺铣,以及前段時(shí)間剛出的ggheatmap(居然是大三的學(xué)生寫的拴曲,后生可畏)。我寫了三種方法凛忿,ggheatmap最為簡(jiǎn)單澈灼,可以直接去看方法3。

畫圖數(shù)據(jù)

熱圖的輸入數(shù)據(jù)嘛蕉汪,是一個(gè)數(shù)值型矩陣:

test = matrix(rnorm(200), 20, 10)
test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] + 3
test[11:20, seq(2, 10, 2)] = test[11:20, seq(2, 10, 2)] + 2
test[15:20, seq(2, 10, 2)] = test[15:20, seq(2, 10, 2)] + 4
colnames(test) = paste("Test", 1:10, sep = "")
rownames(test) = paste("Gene", 1:20, sep = "")

方法1 ggh4x

給ggplot2加聚類樹的R包ggh4x,里面的scale_y_dendrogram函數(shù)逞怨。

library(ggh4x)
library(ggplot2)
library(tidyverse)

yclust <- hclust(dist(test))
xclust <- hclust(dist(t(test)))
p = test %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  pivot_longer(cols = 2:ncol(.),
               names_to = "sample",
               values_to = "exp") %>% 
  ggplot(aes(x = sample,y = rowname))+
  geom_tile(aes(fill = exp))+
  scale_fill_gradient2(midpoint = 2.5,  
                       low = '#2fa1dd',
                       mid="white",
                       high = '#f87669') +
  scale_y_dendrogram(hclust = yclust) +
  scale_x_dendrogram(hclust = xclust,position = 'top') +
  theme(panel.grid = element_blank(), panel.background = element_rect(fill = NA), 
            legend.background = element_rect(fill = NA), plot.background = element_rect(fill = NA), 
            axis.line = element_blank(), axis.ticks = element_blank(), 
            axis.title = element_blank()) 

p

圖還是有模有樣的,只是行名列名貼著聚類樹革砸,不如pheatmap畫的好看算利。所以我嘗試了一下把基因名放到右邊册踩,失敗遼。但是又找到了另外一個(gè)做法:

方法2 ggtree

還是神奇Y叔的包效拭,樹狀圖可視化用的ggtree暂吉,配合拼圖用的aplot,簡(jiǎn)直不要太方便缎患。

p1 = test %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  pivot_longer(cols = 2:ncol(.),
               names_to = "sample",
               values_to = "exp") %>% 
  ggplot(aes(x = sample,y = rowname))+
  geom_tile(aes(fill = exp))+
  scale_fill_gradient2(midpoint = 2.5,  
                       low = '#2fa1dd',
                       mid="white",
                       high = '#f87669') +
  scale_y_discrete(position = "right")+
  theme(panel.grid = element_blank(), panel.background = element_rect(fill = NA), 
            legend.background = element_rect(fill = NA), plot.background = element_rect(fill = NA), 
            axis.line = element_blank(), axis.ticks = element_blank(), 
            axis.title = element_blank()) 

library(ggtree)
p2<-ggtree(yclust)
p2+
  geom_tiplab()+
  xlim(NA,10)
p3<-ggtree(xclust)+layout_dendrogram()
p3+
  geom_tiplab()+
  xlim(NA,12)

library(aplot)
p1%>%
  insert_left(p2,width = 0.2) %>% 
  insert_top(p3,height = 0.2)

本來以為拼圖需要把主體熱圖的行列順序調(diào)整一下才能拼慕的,結(jié)果神奇的aplot能實(shí)現(xiàn)無縫連接,順序調(diào)整猶如merge函數(shù)一樣挤渔,自動(dòng)搞定了嘿~
看到ggheatmap也用到了aplot包肮街,應(yīng)該是同一種方法咯。寫成新的函數(shù)無比方便

方法3 ggheatmap

試了一下行列聚類和加注釋條的操作判导,還是很絲滑的嫉父。只是annotation_color沒有默認(rèn)顏色沛硅,我jio的作者可以在下一版里設(shè)置上默認(rèn)值。

library("ggheatmap")
ggheatmap(test,cluster_rows = T,cluster_cols = T,
          color = colorRampPalette(c("#2fa1dd", "white", "#f87669"))(100))

annotation_col = data.frame(
  CellType = factor(rep(c("CT1", "CT2"), 5))
)
rownames(annotation_col) = paste("Test", 1:10, sep = "")

col <- list(CellType=c(CT1 = "#2fa1dd",CT2 = "#f87669"))

ggheatmap(test,cluster_rows = T,cluster_cols = T,
          color = colorRampPalette(c("#2fa1dd", "white", "#f87669"))(100),
          annotation_cols = annotation_col,
          annotation_color = col,
          scale = "row")

這個(gè)配色我太喜歡了绕辖,恨不得走到哪都帶著稽鞭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市引镊,隨后出現(xiàn)的幾起案子朦蕴,更是在濱河造成了極大的恐慌,老刑警劉巖弟头,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吩抓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赴恨,警方通過查閱死者的電腦和手機(jī)疹娶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伦连,“玉大人雨饺,你說我怎么就攤上這事』蟠荆” “怎么了额港?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)歧焦。 經(jīng)常有香客問我移斩,道長(zhǎng),這世上最難降的妖魔是什么绢馍? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任向瓷,我火速辦了婚禮,結(jié)果婚禮上舰涌,老公的妹妹穿的比我還像新娘猖任。我一直安慰自己,他們只是感情好瓷耙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布朱躺。 她就那樣靜靜地躺著,像睡著了一般哺徊。 火紅的嫁衣襯著肌膚如雪室琢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天落追,我揣著相機(jī)與錄音盈滴,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巢钓,可吹牛的內(nèi)容都是我干的病苗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼症汹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼硫朦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起背镇,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咬展,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瞒斩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體破婆,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年胸囱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祷舀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烹笔,死狀恐怖裳扯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谤职,我是刑警寧澤饰豺,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站柬帕,受9級(jí)特大地震影響哟忍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陷寝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望其馏。 院中可真熱鬧凤跑,春花似錦、人聲如沸叛复。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褐奥。三九已至咖耘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撬码,已是汗流浹背儿倒。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夫否。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓彻犁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親凰慈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汞幢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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