跟着iMeta学做图|用ggClusterNet绘制共现网络(Co-occurrence Network)

本文主要是介绍跟着iMeta学做图|用ggClusterNet绘制共现网络(Co-occurrence Network),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

如果您使用本代码,请引用: Zeyu Zhang. 2022. Tomato microbiome under long-term organic and conventional farming. iMeta 1: e48. 和Tao Wen. 2022. ggClusterNet: An R package for microbiome network analysis and modularity-based multiple network layouts. iMeta 1: e32. 

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

写在前面

之前我们用较为原始的方法复现过论文中的共现网络,本期我们使用ggClusterNet复现来自中国农业大学李季老师团队的论文Tomato Microbiome under Long-term Organic and Conventional Farming中Figure 4 A-D中的共现网络,Figure 4如下:

549b2e1888cb9d1890f62d85c3f9b861.gif

c55716317f5079e6633714732c6adeaa.png

接下来,我们将通过详尽的代码逐步拆解原图,最终实现对原图的复现。

R包检测和安装

01

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

# 检查网络图构建包igraph,如没有则安装
if (!require("igraph"))install.packages("igraph")
if (!require("BiocManager"))install.packages("BiocManager")
if (!require("phyloseq"))BiocManager::install("phyloseq")
if (!require("devtools"))install.packages("devtools")
if (!require("ggClusterNet"))devtools::install_github("taowenmicro/ggClusterNet")
if (!require("ggplot2"))install.packages("ggplot2")
if (!require("sna"))install.packages("sna")
if (!require("tidyfst"))install.packages("tidyfst")library(igraph)
library(phyloseq)
library(sna)
library(ggClusterNet)
library(ggplot2)

生成测试数据

02

设置随机种子并生成2000个otu的丰度表

# 设置随机数种子,确保数据可重复
set.seed(123)
# 生成A、B两个样本各三个重复,共2000个otu的丰度表
otu <- data.frame(replicate(6, sample.int(10, 2000, replace = T))) 
rownames(otu) <- paste0('otu_', 1:nrow(otu)) # 行命名
colnames(otu) <- c('A1', 'A2', 'A3', 'B1', 'B2', 'B3') # 列命名
dim(otu) #查看数据维度
#> [1] 2000    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

生成门水平的otu分类并整合数据

otu2tax <- data.frame(row.names = rownames(otu), tax = sample(c('Proteobacteria', 'Firmicutes', 'Acidobacteriota', 'Chloroflexi', 'Verrucomicrobiota', 'Myxococcota', 'Actinobacteriota', 'Gemmatimonadota', 'Latescibacterota'), 2000, replace = T))
# 生成metadata A, B各三个重复
metadata <- data.frame(row.names = colnames(otu), Group = c(rep('A', 3), rep('B', 3)))
# 构建phyloseq对象
ps <- phyloseq(sample_data(metadata), otu_table(as.matrix(otu), taxa_are_rows = TRUE), tax_table(as.matrix(otu2tax)))

构建图

04

计算OTU之间的相关系数矩阵

result = corMicro(ps = ps, N = 100, # 根据相关系数选取top100进行可视化method.scale = "TMM", # TMM标准化r.threshold = 0.2, # 相关系数阀值p.threshold = 0.05, # p value阀值method = "pearson")  
# 提取相关矩阵
cor = result[[1]]

05

构建图

igraph <- graph_from_adjacency_matrix(cor, diag = F, mode="undirected",weighted=TRUE)

对节点和边进行注释并分组

06

提取过滤后的OTU表

# 网络中包含的OTU的phyloseq文件提取
ps_net = result[[3]]
# 导出otu表格
otu_table = ps_net %>% vegan_otu() %>%t() %>%as.data.frame()

07

对节点进行注释并随机分为三组

#构建分组,可以根据图的最大连接分组,通过clusters(igraph)得到分组信息;也可以自定义分组,这里随机地将100个过滤后的otu分成三组
gp = data.frame(ID = rownames(otu_table), group = sample(1:3, 100, replace = T))
layout = PolygonClusterG(cor = cor, nodeGroup = gp) # 生成网络图布局,'PolygonClusterG'是该论文中的布局
node = layout[[1]] # 提取节点
tax_table = ps_net %>%vegan_tax() %>%as.data.frame()
# node节点注释
nodes = nodeadd(plotcord  = node, otu_table = otu_table, tax_table = tax_table)
edge = edgeBuild(cor = cor, node = node)  # 构建边

网络图可视化

08

画图并保存

# 开始绘图
p1 <- ggplot() + geom_segment(data = edge, aes(x = X1, y = Y1, xend = X2, yend = Y2), size = 0.4, color = 'red') +geom_point(data = nodes, aes(X1, X2, color = tax), size = 5) +scale_colour_brewer(palette = "Set1") +scale_size_continuous(range = c(2, 5)) + scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +theme(panel.background = element_blank()) +theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +theme(legend.background = element_rect(colour = NA)) +theme(panel.background = element_rect(fill = "white",  colour = NA)) +theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
ggsave("plot.png", p1, width = 10, height = 10) # 保存图片

d0bc1689f33a4a54aa3233b53cf2cac4.png

完整代码

# 检查网络图构建包igraph,如没有则安装
if (!require("igraph"))install.packages("igraph")
if (!require("BiocManager"))install.packages("BiocManager")
if (!require("phyloseq"))BiocManager::install("phyloseq")
if (!require("devtools"))install.packages("devtools")
if (!require("ggClusterNet"))devtools::install_github("taowenmicro/ggClusterNet")
if (!require("ggplot2"))install.packages("ggplot2")
if (!require("sna"))install.packages("sna")
if (!require("tidyfst"))install.packages("tidyfst")library(igraph)
library(phyloseq)
library(sna)
library(ggClusterNet)
library(ggplot2)# 设置随机数种子,确保数据可重复
set.seed(123)
# 生成A、B两个样本各三个重复,共2000个otu的丰度表
otu  <-  data.frame(replicate(6, sample.int(10, 2000, replace = T))) 
rownames(otu)  <-  paste0('otu_', 1:nrow(otu)) # 行命名
colnames(otu)  <-  c('A1', 'A2', 'A3', 'B1', 'B2', 'B3') # 列命名dim(otu) #查看数据维度
#> [1] 2000    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="")otu2tax  <-  data.frame(row.names = rownames(otu), tax=sample(c('Proteobacteria', 'Firmicutes', 'Acidobacteriota', 'Chloroflexi', 'Verrucomicrobiota', 'Myxococcota', 'Actinobacteriota', 'Gemmatimonadota', 'Latescibacterota'), 2000, replace = T))
# 生成metadata A, B各三个重复
metadata  <-  data.frame(row.names = colnames(otu), Group=c(rep('A', 3), rep('B', 3)))# 构建phyloseq对象
ps  <-  phyloseq(sample_data(metadata), otu_table(as.matrix(otu), taxa_are_rows=TRUE), tax_table(as.matrix(otu2tax)))
result = corMicro(ps = ps, N = 100, # 根据相关系数选取top100进行可视化method.scale = "TMM", # TMM标准化r.threshold=0.2, # 相关系数阀值p.threshold=0.05, # p value阀值method = "pearson")  # 提取相关矩阵
cor = result[[1]]
igraph  <-  graph_from_adjacency_matrix(cor, diag = F, mode="undirected", weighted=TRUE)# 网络中包含的OTU的phyloseq文件提取
ps_net = result[[3]]# 导出otu表格
otu_table = ps_net %>% vegan_otu() %>%t() %>%as.data.frame()#构建分组,可以根据图的最大连接分组,通过clusters(igraph)得到分组信息;也可以自定义分组,这里随机地将100个过滤后的otu分成三组
gp = data.frame(ID = rownames(otu_table), group=sample(1:3, 100, replace = T))
layout = PolygonClusterG(cor = cor, nodeGroup = gp) # 生成网络图布局,'PolygonClusterG'是该论文中的布局
node = layout[[1]] # 提取节点tax_table = ps_net %>%vegan_tax() %>%as.data.frame()# node节点注释
nodes = nodeadd(plotcord =node, otu_table = otu_table, tax_table = tax_table)
edge = edgeBuild(cor = cor, node = node)  # 构建边# 开始绘图
p1  <-  ggplot() + geom_segment(data = edge, aes(x = X1, y = Y1, xend = X2, yend = Y2), size = 0.4, color = 'red') +geom_point(data = nodes, aes(X1, X2, color=tax), size=5) +scale_colour_brewer(palette = "Set1") +scale_size_continuous(range = c(2, 5)) + scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +theme(panel.background = element_blank()) +theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +theme(legend.background = element_rect(colour = NA)) +theme(panel.background = element_rect(fill = "white",  colour = NA)) +theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())ggsave("plot.png", p1, width = 10, height = 10)

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

更多推荐

(▼ 点击跳转)

iMeta 高引软件+视频解读

iMeta封面 | 宏蛋白质组学分析一站式工具集iMetaLab Suite(加拿大渥太华大学Figeys组)

30c28bd99f75d6fe44517cf2aa8098a7.png

▸▸▸▸

iMeta | 德国国家肿瘤中心顾祖光发表复杂热图(ComplexHeatmap)可视化方法

9557821a94f131c691693861278bb994.png

▸▸▸▸

iMeta | 华南农大陈程杰/夏瑞等发布TBtools构造Circos图的简单方法

d8e37a631bd941b868ff6dec4cc8c5dc.png

▸▸▸▸

iMeta | 高颜值高被引绘图网站imageGP

051940c96ca2bbe5d95361bb37c7a277.png

往期回顾

iMeta 第1卷第1期

2022/3

ff0327a2a7895c4e807adfb2192ab02d.jpeg

🔗:https://onlinelibrary.wiley.com/toc/2770596x/2022/1/1

iMeta 第1卷第2期

2022/6

d7d39634796c7450febe583deacb0da6.png

🔗:https://onlinelibrary.wiley.com/toc/2770596x/2022/1/2

期刊简介

“iMeta” 是由威立、肠菌分会和本领域数百位华人科学家合作出版的开放获取期刊,主编由中科院微生物所刘双江研究员和荷兰格罗宁根大学傅静远教授担任。目的是发表原创研究、方法和综述以促进宏基因组学、微生物组和生物信息学发展。目标是发表前10%(IF > 15)的高影响力论文。期刊特色包括视频投稿、可重复分析、图片打磨、青年编委、前3年免出版费、50万用户的社交媒体宣传等。2022年2月正式创刊发行!

联系我们

iMeta主页:http://www.imeta.science

出版社:https://wileyonlinelibrary.com/journal/imeta

投稿:https://mc.manuscriptcentral.com/imeta
邮箱:office@imeta.science

 微信公众号 

iMeta

 责任编辑 

微微 

这篇关于跟着iMeta学做图|用ggClusterNet绘制共现网络(Co-occurrence Network)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675785

相关文章

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素