ggplot的热图玩法

背景

画热图的体系用的比较多的是pheatmap和ComplexHeatmap这两个包,前者胜在代码简单,功能强大,而后者胜在细节无穷无尽,只有你想不到,没有它做不到。
ggplot2在画热图这件事上,是存在感不太强的。但有时候还必须得用它来画,以期和其他ggplot2的图严丝合缝的拼在一起。

因此我收集了一下ggplot2的成果,发现又解锁了y叔的一个新包aplot,以及前段时间刚出的ggheatmap(居然是大三的学生写的,后生可畏)。我写了三种方法,ggheatmap最为简单,可以直接去看方法3。

画图数据

热图的输入数据嘛,是一个数值型矩阵:

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函数。

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画的好看。所以我尝试了一下把基因名放到右边,失败辽。但是又找到了另外一个做法:

方法2 ggtree

还是神奇Y叔的包,树状图可视化用的ggtree,配合拼图用的aplot,简直不要太方便。

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)

本来以为拼图需要把主体热图的行列顺序调整一下才能拼,结果神奇的aplot能实现无缝连接,顺序调整犹如merge函数一样,自动搞定了嘿~
看到ggheatmap也用到了aplot包,应该是同一种方法咯。写成新的函数无比方便

方法3 ggheatmap

试了一下行列聚类和加注释条的操作,还是很丝滑的。只是annotation_color没有默认颜色,我jio的作者可以在下一版里设置上默认值。

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")

这个配色我太喜欢了,恨不得走到哪都带着。

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

推荐阅读更多精彩内容