前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R tips:交互式网络图展示GO富集子通路

R tips:交互式网络图展示GO富集子通路

作者头像
生信菜鸟团
发布2021-05-24 10:25:26
3.3K0
发布2021-05-24 10:25:26
举报
文章被收录于专栏:生信菜鸟团

clusterProler包可以进行富集分析和可视化,对于富集结果它有一个goplot的绘图类型,用于绘制显著富集通路的有向无环图(DAG)。如下图所示的一个goplot是根据clusterProfiler的自带数据绘制,goplot可以展示富集通路的父通路,并最终定位到了cellular_component(CC)上(这是自然,因为就是进行的CC通路富集)。

代码语言:javascript
复制
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是展示父通路)。

获得GO的父子通路数据

查看goplot的源码enrichplot:::goplot.enrichResult,根据GOSemSim_initial函数的源码,可以确定这个GO父子通路关系数据在GOSemsim包中,通过如下方式可以获得:

代码语言:javascript
复制
# 载入数据
utils::data("gotbl", package = "GOSemSim")

里面包含的通路关系有5种类型:

代码语言:javascript
复制
gotbl$relationship %>% unique()
#[1] "is_a"        "regulates"     "part_of"       "negatively_regulates"      "positively_regulates"

为了简便只使用“is_a”和“part_of”:

代码语言:javascript
复制
GO_relationship <- gotbl %>% filter(relationship %in% c('is_a', 'part_of')) 

子通路网络图

先将富集数据转换为data.frame。

代码语言:javascript
复制
# 转换为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,等等)条通路,那么子通路网络图可以进一步展示这些显著通路是否有显著的子通路(绿色箭头指示)。

代码语言:javascript
复制
# 将显著通路作为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布局,还可以尝试一下其他布局。

这些网络图有一个缺点,不能展示相应的通路名,否则的话,整个网络图会非常凌乱(我把相应的代码注释了,可以自己尝试展示通路名的情况),这个时候可以考虑使用交互网络图来完成。

sigmaNet绘制交互网络图

交互网络图如下,红色的线是“is_a”,紫色的线是“part_of”,点的大小代表连接的数量,由于子通路往往不止一条,所以大的点代表父通路,小点代表子通路,着色的点是显著通路。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获得GO的父子通路数据
  • 子通路网络图
  • sigmaNet绘制交互网络图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档