最近在筹备R语言画图课程,目前正在内测,因为只发了一下朋友圈和内部群就已经很多人了,就没有发在公众号。等我们根据内测的反馈打磨一番再拿出来给大家品鉴哦,可以蹲守!先抛个小彩蛋给大家看看!演示pheatmap + paletteer 一键提升热图逼格,附赠99 套配色清单。
让我们先搞个示例数据,这是热图的帮助文档里的代码(?pheatmap)。
rm(list = ls())
library(pheatmap)
library(paletteer)
set.seed(315)
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 = "")
标准的热图是长这样的:
pheatmap(test)

根据帮助文档调一下颜色是这样的:
library(RColorBrewer)
pheatmap(test,color = colorRampPalette(c("navy", "white", "firebrick3"))(100))

还是有点基础哈?还得调啊。
为什么别人文章里的热图就花花绿绿那么有质感呢?因为他们使用了配色R包哦!
配色R包有非常多,但我在课堂上一直只讲一个,那就是paletteer!它和热图的配合是非常兼容的,举个栗子:
pheatmap(test,
color = paletteer_c("ggthemes::Red-Green-White Diverging",n = 100))
引号里的内容是"配色R包::配色名称"。
是的,人的默认思维都是暖色调代表数值大,冷色调代表数值小,但这个配色呢,看图例就知道,默认的颜色是绿色代表数值大,红色代表数值小,实际应用应该让它反过来,设置direction = -1即可。
pheatmap(test,
color = paletteer_c("ggthemes::Red-Green-White Diverging",
n = 100,direction = -1))
"ggthemes::Red-Green-White Diverging"这样的配色名称,可以用tab补全出来,但是这么多种配色, 哪些适合做热图呢?
热图里如果数据有正负/高低两端,发散型配色(diverging)会更直观,中间的‘白/浅色’通常对应接近 0 或均值。发散型的配色(一共99种),是:
#View(palettes_c_names)
f = palettes_c_names[palettes_c_names$type=="diverging",]
ps = unique(paste(f$package,f$palette,sep = "::"));ps
## [1] "ggthemes::Orange-Blue Diverging"
## [2] "ggthemes::Red-Green Diverging"
## [3] "ggthemes::Green-Blue Diverging"
...(此处省略95行,可以自己用代码获取或者看下面热图的标题)
## [98] "scico::bamO"
## [99] "scico::vanimo"
我非常贴心的做了全部的图,标题就是他们的配色,当你想要复现同款配色图,只需要把第2部分的配色风格换掉就可以。
注:为了拼图好看,我仅保留了热图主体和图例哈!放大可以看到标题!










这里是高级玩家的快乐!lapply+自定义函数可以实现批量画图,patchwork则可以实现批量拼图,超棒的。
这个过程中可能会让装包,就要选择yes。

全是R语言技巧,以前是纯靠手艺,现在有AI的帮助大家可以很好的理解和实现啦!不过自己一点都不懂也是不行的,借用我萌老师的一句话:
工具有很多,但还是要看人怎么用。现在ai这么强,你让一个小学生去分析单细胞数据,他也是做不到的,当代码变得廉价,经验就会变得异常重要, 不然代码对不对也没法评判。
library(patchwork)
res = lapply(ps, function(nm) {
ph = pheatmap(test,color = paletteer_c(nm,n = 100),silent = T,
treeheight_row = 0,treeheight_col = 0,
show_rownames = F,show_colnames = F,
main = nm,)
wrap_elements(full = ph$gtable)
})
#这里只展示前10张图
wrap_plots(res[1:10], ncol = 5)
