微生物共现网络可视化:实现布局自由

  ggraph包常用于网络数据可视化,其语法特征与ggplot2相同,我们很容易将ggplot2的知识扩展到ggraph上。ggraph的绘图思路大致如下:

  1. 计算网络(graph)的布局,获得节点(vertex)在X-Y轴上的坐标值,返回布局数据框layout_df
  2. 利用1中返回的数据框layout_df,利用ggraph(layout_df)函数绘制画布;
  3. 添加图形元素,即节点(vertex)和边(edge)。

  在计算网络布局中,可以使用已经有的算法计算布局,例如"fr", "cycle", "stress"等,但有时我们希望能根据自身数据的需要进行布局,那么我们就可以使用 layout_df <- create_layout(graph_test,layout="manual",x=x,y=y)计算出网络文件graph_test的布局数据框layout_df,然后像在ggplot2中绘图一样绘制网络图即可。

layout_df <- create_layout(graph_test,layout="manual",x=x,y=y) 
ggraph(layout_df)+
	geom_edge_link()+
	geom_node_point()

重点就是:如何根据自身需要计算出节点(vertex)在X-Y轴上的坐标值xy
譬如,我利用stress布局获得了如下结果:
在这里插入图片描述

但我还是觉得有些混乱,我想将同一门内的微生物放在一块进行可视化,如下图:
在这里插入图片描述
此时,我们可以根据自身的需要,巧妙地计算各个节点对应的X-Y值,然后自定义布局即可。虽然我们是自定义布局,但我们也没有必要从轮子造起,灵活运用已有的布局算法实现我们的想法,思路如下:

  1. 根据节点的分类信息属性将网络分解为若干个子网络,即Proteobactria networkAcidobacteria network等;
  2. 对各个子网络利用sphere算法计算网络布局
  3. 对获得的布局坐标进行圆形偏移,即获得自定义布局的XY坐标
  4. 根据xy值自定义网络布局

实战代码

下面我们以按模块分类为例,给出其大致的思路及具体的R代码。

  • 总体思路:
  1. 对微生物共现网络的模块进行划分;
  2. 按照模块大小排序,对前面的模块进行着色,其余归为其它;
  3. 对各模块进行圆形布局,求解布局坐标.
  • R代码:
library(magrittr)
library(igraph)
library(ggraph)
library(purrr)
g1 <- read_graph("~/Desktop/graph_test.graphml",format = "graphml")
wtc <- cluster_louvain(g1,NA)
modularity(wtc)
m<-membership(wtc)
sorted_table_m <- sort(table(m),decreasing = TRUE)
top <- 1:5
df1 <- data.frame(old=names(sorted_table_m),new=c(top,rep("other",length(sorted_table_m)-length(top))))
new_m <- unlist(map(m,function(x) df1[df1$old%in%x,2]))

groupVector <- function(x){
  lev <- levels(as.factor(x))
  len <- length(lev)
  list1 <- vector("list", len)
  for(i in 1:len){
    list1[[i]] <- names(x)[x == lev[i]]
    names(list1)[i] <- lev[i]
  }
  return(list1)
}

gv <- groupVector(new_m) 
g_list <- map(gv,~induced_subgraph(g1,.x))

ly3 <- map(g_list,function(x) create_layout(x,layout = "sphere"))
x <- ly3 %>% map(~.$x)
y <- ly3 %>% map(~.$y)
theta <- seq(0,2*pi,2*pi/(length(g_list)))
mx <- 4*cos(theta[-1])
my <- 4*sin(theta[-1])
mxx <- unlist(map2(x,mx,function(x,y) x+y))
myy <- unlist(map2(y,my,function(x,y) x+y))
name <- unlist(ly3 %>% map(~.$name))
df2 <- data.frame(x=mxx,y=myy,row.names = name)

ly4 <- create_layout(g1,layout = "manual",x=df2[V(g1)$name,1],y=df2[V(g1)$name,2])
edgeColor <- ifelse(E(g1)$weight_1>0,"positive","negative")
colorfactor <- factor(new_m[ly4$name])
mycolor <- c("blue","red","orange","turquoise4","purple","gray")
ggv4 <- ggraph(ly4)+
  geom_edge_link(aes(colour=as.factor(edgeColor)),edge_width=0.1,alpha=0.3)+
  geom_node_point(aes(color=colorfactor))+
  theme_minimal()+
  scale_edge_color_manual(values = c("green4","red"),name="Correlation")+
  scale_color_manual(values = mycolor,name="Modular")+
  theme(axis.title = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_blank(),
        axis.text = element_blank(),
        panel.grid = element_blank())
ggv4
pdf("~/Desktop/graph visualization by modular.pdf",width = 10,height = 7)
ggv4
dev.off()
  • 实现效果
    在这里插入图片描述
    测试数据可查看:
  1. 微生物共现网络可视化:按模块进行圆形布局
  2. 微生物与环境因子共现网络可视化:按物种分类着色,并进行圆形布局
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
微生物是一类生物体,它们很小,只能在显微镜下才能看到。微生物包括细菌、真菌、原生动物和病毒等。它们在自然界中广泛存在且占据着重要地位。 微生物对人类和生态系统都有着复杂的影响。一方面,微生物可以产生酶和其他分子,帮助分解有机物并促进自然降解。此外,它们也可以参与植物养分循环,提供植物所需的营养物质。另一方面,一些微生物是人类的有益伙伴,比如肠道菌群中的益生菌可以帮助消化、促进免疫等。但是,也有一些微生物对人类和其他生物体有害,比如致病细菌可以引起疾病。 网络是由一系列节点和边组成的图结构。而igraph是Python中常用的一个网络分析工具包。使用igraph可以对网络进行建模、分析和可视化。 在微生物领域,网络分析可以帮助我们研究微生物之间的相互作用和组织结构。我们可以将微生物看作是网络的节点,而它们之间的相互作用可以看作是网络的边。这样一来,我们可以使用igraph来构建微生物网络,并对网络进行分析。 通过分析微生物网络,我们可以研究微生物之间的共生关系、竞争关系以及整体结构特征。这有助于我们更好地理解微生物群落的生态系统功能和稳定性,还可以为研究微生物的治疗应用提供参考。此外,网络分析还可以帮助我们发现网络中的关键微生物物种,了解它们在微生物群落中的重要作用。 总的来说,微生物网络igraph都是非常重要的研究领域。微生物的研究可以帮助我们了解生态系统的功能,而网络igraph可以帮助我们更好地理解和分析微生物之间的相互作用关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长1994

您的鼓励有助于我创作更多高质量

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值