土壤细菌到叶际的确定性定殖论文复现

Author

葛方苏、张荣耀、张振阳

Published

June 24, 2026

论文信息

  • 论文题目: Deterministic colonization arises early during the transition of soil bacteria to the phyllosphere and is shaped by plant-microbe interactions
  • DOI: 10.1186/s40168-025-02090-1
  • 复现目标: Figure 4 微生物富集结果

小组信息

学号 姓名 GitHub
2025303120139 葛方苏 @geyuqing3-stack
2025303120099 张荣耀 @ZHGlory-z
2025303110057 张振阳 @ZZY-423

数据来源

  • 原始测序数据: NCBI SRA 数据库 BioProject: PRJNA1174406
  • 分析脚本和元数据: Figshare 平台公开数据包

数据加载与预处理

# 加载必要的包
library(vegan)
library(ggplot2)
library(RColorBrewer)
library(tidyr)
library(dplyr)
library(ggpubr)

# 加载数据
MeganData <- read.table(file="./ForBarchart.txt", header=T, sep="\t")

# 数据预处理
PlotLevel <- "Order"
MeganDataPlot <- MeganData %>% count(Sample, Order)
MeganDataPlot$ra <- MeganDataPlot$n / 30
MeganDataPlot$ra[which(MeganDataPlot$Sample == "PB2PB")]  <- MeganDataPlot$n[which(MeganDataPlot$Sample == "PB2PB")] / 31

# 设置颜色
mycolors <- colorRampPalette(brewer.pal(8, "Set2"))(10)
names(mycolors) <- unique(MeganDataPlot$Order)
Taxscale <- scale_fill_manual(name = "Order",values = mycolors)

# 设置因子水平
MeganDataPlot$Sample <- factor(MeganDataPlot$Sample, levels=c("NG2NG", "NG2PB", "NG2Col", "PB2PB", "PB2NG", "PB2Col"))

print("数据加载成功")
[1] "数据加载成功"
head(MeganDataPlot)
  Sample             Order  n         ra
1 NG2Col   Burkholderiales  1 0.03333333
2 NG2Col Corynebacteriales  4 0.13333333
3 NG2Col  Hyphomicrobiales  3 0.10000000
4 NG2Col     Micrococcales  8 0.26666667
5 NG2Col   Pseudomonadales  1 0.03333333
6 NG2Col  Sphingomonadales 11 0.36666667

CrossInoc 柱状图

# 绘制柱状图
ggplot(data=MeganDataPlot) + geom_bar(aes(x=Sample, y=ra, fill=Order), stat="identity") +
 theme_classic(base_size=18) + ylab("Relative Abundance") + theme(axis.text.x = element_text(angle = 45, hjust=1)) +
 Taxscale

CrossInoc 柱状图 - 微生物相对丰度

CrossInoc 气泡图

# 气泡图数据准备
MeganDataPlot <- MeganData %>% count(Sample, Genus)
MeganDataPlot$Sample <- factor(MeganDataPlot$Sample, levels=c("NG2NG", "NG2PB", "NG2Col", "PB2PB", "PB2NG", "PB2Col"))
MeganDataPlot$Origin <- substr(MeganDataPlot$Sample, start=1, stop = 2)
MeganDataPlot_NG <- MeganDataPlot[which(MeganDataPlot$Origin == "NG"),]
MeganDataPlot_PB <- MeganDataPlot[which(MeganDataPlot$Origin == "PB"),]

# NG 组气泡图
NG_bubble <- ggplot(MeganDataPlot_NG, aes(x =Sample, y = Genus)) +
  geom_point(aes(size=n),shape=21, fill="black") +
  theme_classic() +
  scale_size_area(max_size = max(MeganDataPlot_NG$n))

# PB 组气泡图
PB_bubble <- ggplot(MeganDataPlot_PB, aes(x =Sample, y = Genus)) +
  geom_point(aes(size=n),shape=21, fill="black") +
  theme_classic() +
  scale_size_area(max_size = max(MeganDataPlot_PB$n))

# 组合图
ggarrange(NG_bubble, PB_bubble + rremove("ylab"), widths = c(2, 2), common.legend = T)

CrossInoc 气泡图 - 属水平微生物分布

统计分析

Origin 组间差异分析

# 数据准备
MeganData$Origin <- substr(MeganData$Sample, start=1, stop = 2)
MeganDataStat <- MeganData %>% count(Origin, Genus)

# 卡方检验
pvals_genera_originNGvPB <- c()
for(i in 1:length(unique(MeganDataStat$Genus))){
  MeganDataStat_test <- MeganDataStat[which(MeganDataStat$Genus == unique(MeganDataStat$Genus)[i]),]
  MeganDataStat_test$rest <- 90 - MeganDataStat_test$n
  conttab <- rbind(MeganDataStat_test$n, MeganDataStat_test$rest)
  test <- chisq.test(conttab)
  pvals_genera_originNGvPB <- c(pvals_genera_originNGvPB,test$p.value)
}

# 结果汇总
pvals_genera_originNGvPB <- data.frame(pvals_genera_originNGvPB, unique(MeganDataStat$Genus))
pvals_genera_originNGvPB$padj <- p.adjust(pvals_genera_originNGvPB$pvals_genera_originNGvPB, method="fdr")

print("Origin 组间差异分析结果:")
[1] "Origin 组间差异分析结果:"
head(pvals_genera_originNGvPB)
  pvals_genera_originNGvPB unique.MeganDataStat.Genus.         padj
1             1.640690e-01                             2.331507e-01
2             1.759367e-20                  Acidovorax 5.278101e-20
3             1.243805e-19               Brevibacillus 3.052975e-19
4             4.560565e-01              Curtobacterium 5.597058e-01
5             1.000000e+00              Frondihabitans 1.000000e+00
6             5.448859e-18           Janthinobacterium 1.225993e-17

NG 组内差异分析

pvals_genera_NG <- c()
for(i in 1:length(unique(MeganDataPlot_NG$Genus))){
  MeganDataPlot_NG_test <- MeganDataPlot_NG[which(MeganDataPlot_NG$Genus == unique(MeganDataPlot_NG$Genus)[i]),]
  MeganDataPlot_NG_test$rest <- 30 - MeganDataPlot_NG_test$n
  conttab <- rbind(MeganDataPlot_NG_test$n, MeganDataPlot_NG_test$rest)
  test <- chisq.test(conttab)
  pvals_genera_NG <- c(pvals_genera_NG,test$p.value)
}

pvals_genera_NG <- data.frame(pvals_genera_NG, unique(MeganDataPlot_NG$Genus))
pvals_genera_NG$padj <- p.adjust(pvals_genera_NG$pvals_genera_NG, method="fdr")

print("NG 组内差异分析结果:")
[1] "NG 组内差异分析结果:"
head(pvals_genera_NG)
  pvals_genera_NG unique.MeganDataPlot_NG.Genus.         padj
1    6.047729e-01                                6.719698e-01
2    5.381482e-01                 Curtobacterium 6.719698e-01
3    7.697974e-01              Janthinobacterium 7.697974e-01
4    5.852511e-01                      Leifsonia 6.719698e-01
5    3.186355e-07               Methylobacterium 7.080790e-07
6    7.697974e-01                 Microbacterium 7.697974e-01

PB 组内差异分析

pvals_genera_PB <- c()
for(i in 1:length(unique(MeganDataPlot_PB$Genus))){
  MeganDataPlot_PB_test <- MeganDataPlot_PB[which(MeganDataPlot_PB$Genus == unique(MeganDataPlot_PB$Genus)[i]),]
  MeganDataPlot_PB_test$rest <- 30 - MeganDataPlot_PB_test$n
  conttab <- rbind(MeganDataPlot_PB_test$n, MeganDataPlot_PB_test$rest)
  test <- chisq.test(conttab)
  pvals_genera_PB <- c(pvals_genera_PB,test$p.value)
}

pvals_genera_PB <- data.frame(pvals_genera_PB, unique(MeganDataPlot_PB$Genus))
pvals_genera_PB$padj <- p.adjust(pvals_genera_PB$pvals_genera_PB, method="fdr")

print("PB 组内差异分析结果:")
[1] "PB 组内差异分析结果:"
head(pvals_genera_PB)
  pvals_genera_PB unique.MeganDataPlot_PB.Genus.         padj
1    6.376282e-01                                7.970352e-01
2    3.186355e-07                  Brevundimonas 7.080790e-07
3    2.004595e-01                    Clavibacter 3.340992e-01
4    3.186355e-07                    Herbiconiux 7.080790e-07
5    2.065286e-06                      Leifsonia 4.130572e-06
6    1.000000e+00               Methylobacterium 1.000000e+00

复现结论

本次复现成功生成了论文 Figure 4 相关的所有图表,验证了原作者结果的可复现性。主要发现包括:

  1. CrossInoc 柱状图展示了不同处理组的微生物相对丰度分布
  2. 气泡图揭示了属水平的微生物群落结构差异
  3. 统计分析证实了 Origin 组间和组内的显著差异