跟着iMeta学做图|微生物组共现网络(Co-occurrence Network)绘制

原始教程链接:https://github.com/iMetaScience/iMetaPlot/tree/main/221012Co-occurrence_network

写在前面

图(Graph)是一种从数据中抽象出节点(Node)并用边(Edge)展示各节点之间关系的数据结构,共现网络(Co-occurrence network)是一种特殊的图。目前生态学领域用到的网络图大多基于群落数据的相关性构建。本文将以西北农林科技大学焦硕教授在iMeta上发表的论文Linking soil fungi to bacterial community assemblyin arid ecosystems中Figure1 C为例,使用R语言逐步剖析共现网络图的绘制方法。

iMeta:西农韦革宏团队焦硕等-土壤真菌驱动细菌群落的构建(全文翻译/PPT/视频解读)

先上原图:

23cd03dc3f0e84664880a53cbde5a04b.gif

c05b3cf5c4f78aadb7b631338b840866.png

代码编写及注释:农心生信工作室

R包检测和安装

01

先安装软件包及其依赖并将所有包载入

# 检查BiocManager包,如没有则安装
if (!require("BiocManager"))
  install.packages("BiocManager")
# 检查网络图构建包igraph,如没有则安装
if (!require("igraph"))
  install.packages("igraph")
# 加载网络图构建包igraph
library(igraph)
# 手动安装WGCNA的两个依赖
if (!require("impute"))
  BiocManager::install("impute")
if (!require("preprocessCore"))
  BiocManager::install("preprocessCore")
# 用于计算OTU/ASV之间的相关性
if (!require("WGCNA"))
  install.packages("WGCNA") 
library(WGCNA)

生成测试数据

02

设置随机种子并生成1000个ASV的丰度表

# 设置随机数种子,确保数据可重复
set.seed(123)
# 生成A、B两个样本各三个重复,共1000个ASV的丰度表
otu <- data.frame(replicate(6, sample.int(10, 1000, replace = T))) 
rownames(otu) <- paste0('ASV_', 1:nrow(otu)) # 行命名
colnames(otu) <- c('A1', 'A2', 'A3', 'B1', 'B2', 'B3') # 列命名
dim(otu) #查看数据维度
#> [1] 1000    6
# 可选 从文件读取矩阵
# write.table(otu, file="otu.txt", sep="\t", quote=F, row.names=T, col.names=T)
# otu = read.table(("otu.txt"), header=T, row.names=1, sep="\t", comment.char="")

计算相关系数矩阵

03

计算ASV/OTU之间的相关系数矩阵:使用WGCNA包计算ASV/OTU之间的spearman相关系数矩阵,并对结果进行筛选,筛选标准与原文中保持一致,为了方便绘图,先定义一个函数CorrDF整理ASV之间的连接关系

CorrDF <- function(cormat, pmat) {
  ut <- upper.tri(cormat) # 由于相关性矩阵是对称的,取上三角矩阵计算即可
  data.frame(
    from = rownames(cormat)[col(cormat)[ut]],
    to = rownames(cormat)[row(cormat)[ut]],
    cor = (cormat)[ut],
    p = pmat[ut]
  )
}
occor <- corAndPvalue(t(otu), use='pairwise', method='spearman') # 计算ASV/OTU之间的spearman相关性
cor_df <- CorrDF(occor$cor , occor$p) # 整理ASV之间的连接关系
cor_df <- cor_df[which(abs(cor_df$cor) >= 0.6),] # 保留spearman相关性绝对值>0.6的边
cor_df <- cor_df[which(cor_df$p < 0.001),] # 保留p-value < 0.001的边

构建网络图

04

使用igraph构建网络图

igraph <- graph_from_data_frame(cor_df, direct=F) 
length(V(igraph)) # 查看节点数
#> [1] 852
length(E(igraph)) # 查看边数
#> [1] 1108  注:复制代码时小心一下,这里在末尾直接按回车健,Rstudio会默认下一行也是#>开头,所以多按一下回车就好了

05

根据原文的方法,网络图中节点的大小与节点的度成正比,正相关的节点其边为深灰色,负相关的节点其边为红色,边的粗细与相关系数成正比,需要注意的是,原文中的节点颜色是根据ASV/OTU对干旱的偏好上着色的,这里简化为随机颜色。

V(igraph)$size <- degree(igraph)*0.8 # 节点的大小与节点的度成正比,进行0.8倍放缩
# 生成一些随机颜色
cols <- c('#00A6FB', '#0582CA', '#fff0f3', '#006494', '#c9e4ca', '#31572c', '#90a955', '#ecf39e', '#a4133c', '#c9184a', '#ff4d6d')
V(igraph)$color <- sample(cols, length(V(igraph)), replace = T) # 从随机颜色中采样给节点上色
E(igraph)$color[E(igraph)$cor >= 0.6] <- "darkgray" # 正相关则边为深灰色
E(igraph)$color[E(igraph)$cor <= -0.6] <- "red" # 负相关则边为红色
E(igraph)$width <- abs(E(igraph)$cor)*0.5 # 边的粗细与相关系数成正比,进行0.5倍放缩

网络图可视化

06

最后就是调整布局算法并生成好看的网络图了,igraph提供多种布局算法可供选择,当节点较多时构建布局比较慢,大家需要耐心等待

coords <- layout_with_fr(igraph, niter=9999,grid="nogrid") # 生成布局
pdf("Figure1C.pdf", height = 10, width = 10) # 保存图为PDF,指定宽和高
plot(igraph, layout=coords, vertex.label = NA, vertex.frame.color=NA) # 画图
dev.off()
#> png 
#>   2

c207997ae34fa9769ad56f82f13f311c.png

完整代码

# 加载包
library(igraph)
library(WGCNA)
# 设置随机数种子,确保数据可重复
set.seed(123)
# 生成A、B两个样本各三个重复,共1000个ASV的丰度表
otu <- data.frame(replicate(6, sample.int(10, 1000, replace = T))) 
rownames(otu) <- paste0('ASV_', 1:nrow(otu)) # 行命名
colnames(otu) <- c('A1', 'A2', 'A3', 'B1', 'B2', 'B3') # 列命名
dim(otu) #查看数据维度
#> [1] 1000    6
CorrDF <- function(cormat, pmat) {
  ut <- upper.tri(cormat) # 由于相关性矩阵是对称的,取上三角矩阵计算即可
  data.frame(
    from = rownames(cormat)[col(cormat)[ut]],
    to = rownames(cormat)[row(cormat)[ut]],
    cor = (cormat)[ut],
    p = pmat[ut]
  )
}
occor <- corAndPvalue(t(otu), use='pairwise', method='spearman') # 计算OTU/ASV之间的spearman相关性
cor_df <- CorrDF(occor$cor , occor$p) # 整理ASV之间的连接关系
cor_df <- cor_df[which(abs(cor_df$cor) >= 0.6),] # 保留spearman相关性绝对值>0.6的边
cor_df <- cor_df[which(cor_df$p < 0.001),] # 保留p-value < 0.001的边
igraph <- graph_from_data_frame(cor_df, direct=F) 
length(V(igraph)) # 查看节点数
#> [1] 852
length(E(igraph)) # 查看边数
#> [1] 1108
V(igraph)$size <- degree(igraph)*0.8 # 节点的大小与节点的度成正比,进行0.8倍放缩
# 生成一些随机颜色
cols <- c('#00A6FB', '#0582CA', '#fff0f3', '#006494', '#c9e4ca', '#31572c', '#90a955', '#ecf39e', '#a4133c', '#c9184a', '#ff4d6d')
V(igraph)$color <- sample(cols, length(V(igraph)), replace = T) # 从随机颜色中采样给节点上色
E(igraph)$color[E(igraph)$cor >= 0.6] <- "darkgray" # 正相关则边为深灰色
E(igraph)$color[E(igraph)$cor <= -0.6] <- "red" # 负相关则边为红色
E(igraph)$width <- abs(E(igraph)$cor)*0.5 # 边的粗细与相关系数成正比,进行0.5倍放缩
coords <- layout_with_fr(igraph, niter=9999,grid="nogrid") # 生成布局
pdf("Figure1C.pdf", height = 10,width = 10) # 保存图为PDF,指定宽和高
plot(igraph, layout=coords, vertex.label = NA, vertex.frame.color=NA) # 画图
dev.off()
#> png 
#>   2

以上数据和代码仅供大家参考,如有不完善之处,欢迎大家指正!

猜你喜欢

iMeta简介 高引文章 高颜值绘图imageGP 网络分析iNAP
iMeta网页工具 代谢组MetOrigin 美吉云乳酸化预测DeepKla
iMeta综述 肠菌菌群 植物菌群 口腔菌群 蛋白质结构预测

10000+:菌群分析 宝宝与猫狗 梅毒狂想曲 提DNA发Nature

系列教程:微生物组入门 Biostar 微生物组  宏基因组

专业技能:学术图表 高分文章 生信宝典 不可或缺的人

一文读懂:宏基因组 寄生虫益处 进化树 必备技能:提问 搜索  Endnote

扩增子分析:图表解读 分析流程 统计绘图

16S功能预测   PICRUSt  FAPROTAX  Bugbase Tax4Fun

生物科普:  肠道细菌 人体上的生命 生命大跃进  细胞暗战 人体奥秘  

写在后面

为鼓励读者交流快速解决科研困难,我们建立了“宏基因组”讨论群,己有国内外6000+ 科研人员加入。请添加主编微信meta-genomics带你入群,务必备注“姓名-单位-研究方向-职称/年级”。高级职称请注明身份,另有海内外微生物PI群供大佬合作交流。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍未解决群内讨论,问题不私聊,帮助同行。

点击阅读原文,跳转最新文章目录阅读

### 解读和描述 Gephi 绘制微生物网络图 #### 微生物网络的基础概念 微生物网络是一种用于展示不同微生物之间同出模式的表。这种网络能够揭示微生物群落内部复杂的交互关系,有助于理解生态系统的结构与功能。通过分析这些网络中的节点(代表不同的微生物物种)以及连接它们的边(表示两两之间的关联强度),可以深入了解特定环境中微生物间的协同作用或竞争机制。 #### 使用Gephi生成的微生物网络特点 Gephi作为一款强大的开源工具,在处理此类复杂数据集方面表出色[^1]。当利用该平台构建并呈一个基于实际样本得到的微生物存模型时: - **节点(Node)**:每一个圆圈或其他形状都代表着一种独特的微生物分类单元(OTU),即操作分类单位。通常情况下,较大的节点意味着更高的丰度或者是更显著的存在感。 - **边缘(Edge)**:线条用来指示两个节点间存在统计意义上的正向或者负向联系。如果两条线段颜色较深,则表明两者之间的生程度更高;反之则可能暗示着拮抗效应。此外,还可以设置不同的属性来区分各类互动形式,例如化信号传递、物质交换等特性[^2]。 #### 数据准备过程概述 为了创建上述类型的可视化效果,研究者们往往需要先准备好相应的输入资料——具体来说就是所谓的“边文件(edge file)”与“点文件(node file)”。前者记录了每一对感兴趣的实体及其相互影响的程度参数;后者包含了关于各个独立个体的基本信息,像名称编号之类的标识符。 ```python import pandas as pd # 假设我们有一个CSV格式的边列表 edges_df = pd.read_csv('edge_file.csv') # 查看前几行以确认加载成功 print(edges_df.head()) ``` #### 结果阐释指南 一旦完成了绘工作之后,下一步便是仔细审视所得像所传达的信息: - 关注那些处于中心位置且拥有众多连线指向自己的超级传播者型节点; - 寻找集群象,这可能是由于某些局部区域内的成员彼此紧密相连而形成的子团体; - 考虑到色彩编码方案的选择对于直观感受的影响很大,因此务必留意开发者是如何运用色调差异去强调重点部分或是划分层次级别的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值