复现Cell、Nature富集分析结果可视化-Fold enri
2024-12-21 本文已影响0人
KS科研分享与服务
这种nature\Cell都在用的富集结果展示形式:
image.png
(reference:【1】Chen et al., 2020, Cell 182, 226–244 July 9, 2020 ª 2020 Elsevier Inc. https://doi.org/10.1016/j.cell.2020.06.012,
【2】https://doi.org/10.1038/s41591-023-02790-x)
一直想复现2020年这篇Cell文章的某些图,最近群里小伙伴@萌萌哒提供了另外一张图,其实对比一下,两篇文章分析可视化应该用的同一套体系。我们先从富集这幅图开始(对了,nature这篇文章提供了大多数的代码,粗略的,可以学习)。从文章提供的代码出图和文章最终的图差距很大,说明即使高分文章可视化也是需要靠后期的。这个富集图有两个需要实现的,一个是Fold Enrichment计算,因为很多文章富集出现这个参数,小伙伴经常咨询。还有这幅图的一种伪3D效果。原文描述富集分析使用的DAVID。
DAVID富集分析(https://david.ncifcrf.gov/home.jsp):说实话,DAVID是一个优秀的在线富集分析工具,在我认知里面,好几年前因为各种数据挖掘或者一些帖子,使得口碑不好,但是对于非代码分析来说,这是一个很好的工具,他的数据库也在不断的更新,不像有些网站只是做出来了而已,然后没有了维护。而且很多高分文章依然在使用,值得使用!DAVID是直接计算提供了Fold enrichment值。
参考:https://mp.weixin.qq.com/s/1OBeuCtf5qcSplKXd1IMtg?token=971255988&lang=zh_CN
富集完成后,读取数据处理;
setwd('D:\\KS项目\\公众号文章\\富集分析可视化-fold enrichment-ggplot2伪3D点发光效果')
#读入down的富集结果
Down_rich <- read.table("Down_enrich_DAVIA.txt", header = T, sep = '\t',check.names = F)
Down_rich_top15 <- Down_rich[1:15,]
Down_rich_top15$Term <- sub("^.*~", "", Down_rich_top15$Term)
Down_rich_top15$group <- "Down"
#读入top富集结果
Up_rich <- read.table("Up_enrichment_DAVID.txt", header = T, sep = '\t',check.names = F)
Up_rich_top15 <- Up_rich[1:15,]
Up_rich_top15$Term <- sub("^.*~", "", Up_rich_top15$Term)
Up_rich_top15$group <- "Up"
# rm(Down_rich,Up_rich)
DAVID_rich <- rbind(Up_rich_top15, Down_rich_top15)#合并数据作图
colnames(DAVID_rich)[4] <- "Gene Ratio"
ggplot2作图:
ggplot(DAVID_rich, aes(x = -log(FDR),y=`Fold Enrichment`, color=group))+
geom_point(aes(size=`Gene Ratio`))+
# geom_point(aes(size=`Gene Ratio`),shape=21, color='black',stroke=1)+
geom_point_blur(aes(blur_size = `Gene Ratio`/10,
blur_steps=50),
show.legend = F, color='#FFFFFF')+
# scale_blur_size_continuous(range = c(1,5))+
scale_size(range = c(4,12))+
scale_x_continuous(limit = c(-10, 40))+
scale_color_manual(values = c("#0F4DE4","#FF322F"))+
theme_classic()+
geom_text_repel(aes(label=str_wrap(Term,50), color=group),
size=4, fontface="italic", #标签设置,颜色、大小、字体、指示箭头设置
point.padding = 0.3, segment.color = 'black',
segment.size = 0.5, force = 1, max.iter = 5e5)