clusterProler包可以进行富集分析和可视化,对于富集结果它有一个goplot的绘图类型,用于绘制显著富集通路的有向无环图(DAG)。如下图所示的一个goplot是根据clusterProfiler的自带数据绘制,goplot可以展示富集通路的父通路,并最终定位到了cellular_component(CC)上(这是自然,因为就是进行的CC通路富集)。
library(clusterProfiler)
# 差异基因
data(geneList, package="DOSE")
gene <- names(geneList)[abs(geneList) > 2]
# 富集分析
ego <- enrichGO(gene = gene,
universe = names(geneList),
OrgDb = org.Hs.eg.db,
ont = "CC",
pAdjustMethod = "BH",
pvalueCutoff = 0.01,
qvalueCutoff = 0.05,
readable = TRUE)
# goplot
enrichplot::goplot(ego)
一般进行富集分析的GO数据是来源于R的org.db包,但是org.db里面并没有GO通路的父子通路的数据,如果拿到这个数据,也可以用于进一步展示显著通路的子通路(有别于DAG是展示父通路)。
查看goplot的源码enrichplot:::goplot.enrichResult
,根据GOSemSim_initial
函数的源码,可以确定这个GO父子通路关系数据在GOSemsim包中,通过如下方式可以获得:
# 载入数据
utils::data("gotbl", package = "GOSemSim")
里面包含的通路关系有5种类型:
gotbl$relationship %>% unique()
#[1] "is_a" "regulates" "part_of" "negatively_regulates" "positively_regulates"
为了简便只使用“is_a”和“part_of”:
GO_relationship <- gotbl %>% filter(relationship %in% c('is_a', 'part_of'))
先将富集数据转换为data.frame。
# 转换为data.frame
GO_enrich <- ego@result
# 前20条通路的data.frame
GO_enrich_sub <- ego %>% as.data.frame() %>% dplyr::slice(1:20)
绘制网络图,根据箭头的指向判断子通路,根据点的颜色判断是否是显著的。
富集分析时dotplot只展示最显著的n(n=10, 15, 20,等等)条通路,那么子通路网络图可以进一步展示这些显著通路是否有显著的子通路(绿色箭头指示)。
# 将显著通路作为parent去查找子通路
children <- GO_relationship %>% filter(parent %in% GO_enrich_sub$ID)
# 网络图的from与to是网络图的关键元素
# 每一个from与to的组合就代表一个网络图的一条连线
go_df <- children %>% dplyr::rename(to = Term)
go_df$from <- GO_relationship$Term[base::match(go_df$parent, GO_relationship$go_id)]
# ggraph绘图
graph <- tidygraph::as_tbl_graph(go_df, directed = TRUE)
graph <- graph %>%
mutate(pvalue = GO_enrich[match(name, GO_enrich$Description), 'p.adjust']) %>%
# enrich代表此通路是否显著
mutate(enrich = ifelse(pvalue < 0.05, TRUE, FALSE)) %>%
mutate(enrich = ifelse(is.na(enrich), FALSE, enrich))
ggraph::ggraph(graph, layout = "kk") + # 调整布局的地方layout circular algorithm...
geom_edge_link(aes(edge_linetype = relationship), color = 'orange',
arrow = arrow(angle = 30, length = unit(0.1, "inches"),
ends = "last")) +
geom_node_point(aes(color = enrich), size = 2) +
# 不添加label,否则太过杂乱
# geom_node_text(aes(label = name)) +
scale_color_manual(values = c('TRUE' = "red", 'FALSE' = "grey")) +
guides(color = FALSE) +
theme_void()
这个网络图倒也不局限于kk布局,还可以尝试一下其他布局。
这些网络图有一个缺点,不能展示相应的通路名,否则的话,整个网络图会非常凌乱(我把相应的代码注释了,可以自己尝试展示通路名的情况),这个时候可以考虑使用交互网络图来完成。
交互网络图如下,红色的线是“is_a”,紫色的线是“part_of”,点的大小代表连接的数量,由于子通路往往不止一条,所以大的点代表父通路,小点代表子通路,着色的点是显著通路。
i_graph <- tidygraph::as.igraph(graph)
layout <- igraph::layout_with_gem(graph)
sig <- sigmaNet::sigmaFromIgraph(i_graph, layout = layout) %>%
sigmaNet::addNodeColors(colorAttr = 'enrich') %>%
sigmaNet::addNodeSize(sizeMetric = 'degree',
minSize = 2,
maxSize = 8) %>%
sigmaNet::addEdgeColors(colorAttr = 'relationship',
colorPal = 'Pastel1')
sig
这个网络图我把它保存为了离线html文件,感兴趣可以查看,使用浏览器打开html文件。
链接:https://pan.baidu.com/s/1RtOP1Hlz6QQGuFKnM1TtEQ 提取码:i71r