前段时间在学习的时候看到了简书更新,觉得小明哥的这种做法稍显复杂,作为R小白,我之前一直在用pheatmap做热图,所以觉得做这种图片还是热图来的快捷一些。
原教程见
跟着Nature Metabolism学作图:R语言ggplot2热图组合树图和双层分组标记 - 简书 (jianshu.com)
首先还是之前的原图文简介:
三幅图的结构大致类似,复杂一点的是O图,所以还是针对O图的复现。
数据点击这里即可下载:
下载好后新建一个project,复制之前的即可,然后打开。
打开找到数据位置,先把NA换成 0 不然后面数据就没法搞了,然后选择数据复制。
#加载一些常用的包
library(pheatmap)
library(data.table)
library(ggplot2)
#复制完后直接读取剪切板
data <- read.delim('clipboard',header = T,row.names = 'X')
head(data)
#可以看到分组名就在列名里,由此我们构建一个分组
grouporg <- rep(c('brain','heart','lung','kidney','liver','vis','sc'),rep(3,7))
grouptissue <- rep(c('a','c','v'),7)
#构建 热图的分组标签,是一个dataframe
annotation_col = data.frame(tissue = grouptissue ,
organ = grouporg)
rownames(annotation_col) <- colnames(data) ##rowname要和dataframe对应。
## 分组的颜色 选一个喜欢的额颜色,构建一个list
ann_colors =list(organ =c( brain="#bfc8bf",
heart="#8cb5ad",
lung="#648a86",
kidney="#9b9b75",
liver="#8d8d45",
vis = '#D1EEF2FF',
sc = '#ECE0C3FF'),
tissue = c(a = '#95C08BFF',
c = '#FFBEFEFF',
v = '#FF8B26FF'))
##画图 tips 图片赋值对象外加括号就可以一边赋值一边出图
(p = pheatmap(data, #热图的数据
cluster_rows = T,#行聚类
cluster_cols = F,#列聚类,可以看出样本之间的区分度
annotation_col =annotation_col, #标注样本分类 就是刚才的分组
# annotation_row = annotation_row, #要是基因有分组的话,也可以构建一个基因分组
annotation_legend=TRUE, # 显示注释
show_rownames = T,# 显示行名
show_colnames = F,# 列名
# scale = "row", #以行来标准化,这个功能很不错 但是画出来对比了一下,原文没有标准化
annotation_colors =ann_colors ,#组标签的颜色
gaps_col = c(3,6,9,12,15,18), #中间加一组gap,区分度更高
treeheight_row = 20, #聚类树高低
treeheight_col = 0, # 列聚类树,此处没聚类,要是有设置为0就可以只聚类不显示树
clustering_distance_rows = "manhattan",##多种聚类方法可以尝试,总有一款你喜欢
breaks = seq(-1.5,1.5,length.out = 100), ##热图的颜色 修改
color =colorRampPalette(c("black", "white","red"))(100),#调成一个顺眼的颜色
main =' pheatmap ',border=F,#外边框,喜欢无边框的
cellwidth = 6, cellheight = 6,# 格子比例
fontsize = 6))
直接出的图,右侧的标签和原图稍有不符,pheatmap的缺点就是,标签不能直接写到图上的标签上(也可能是我没发现)
也是小问题,
pdf('123plot.pdf',width = 6,height = 4)
p
dev.off()
保存一下用AI修一下,把名字移上去即可
对比一下原图
也差不多一致了。