扩增子分析较常用的软件是 QIIME2,然而其生成的图并不美观,且无法下载,是不可能够达到发表要求的,因此需要我们通过其他方法将 QIIME2 生成的数据结果进行可视化。本文将记录相关的分析方法和示例。
# 准备数据
- 特征表(Feature table),或者叫做 OTU 表,本教程中文件名为 feature-table.tsv。该文件可由 QIIME2 生成,由 biome 格式转换而来。
F01 F02 F03 F04 F05 F06 H2_1 H2_2 H2_3 H2_4 H2_5 H2_6 I1_1 I1_2 I1_3 I1_4 I1_5 I1_6 | |
3733c766539aba5e3e8f964a5ba39048 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 | |
547715c94c5b0c7ba2049658f732397b 0.0 0.0 0.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 | |
708c69ff1252447c0709333304cd9bed 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 | |
344ee69a9e51ffac2811294d3f04833d 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 | |
d2e467b7867f49c25caaacdea5c7eb43 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 0.0 0.0 0.0 0.0 | |
4adc9b2b0866f620425d07d3ff7ca7e2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 0.0 0.0 0.0 0.0 | |
0ffcdef70b9c1436126ba32d7a40d961 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 0.0 0.0 0.0 | |
7170ce6c7520acc3c13189478aea54a8 53.0 0.0 0.0 0.0 0.0 0.0 37.0 25.0 0.0 0.0 0.0 0.0 23.0 21.0 0.0 0.0 0.0 0.0 | |
b624986630f3d33fbe0a21e66c46d1a5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 | |
78305c3f5955043aba7de952c78859c9 0.0 0.0 22.0 57.0 73.0 55.0 0.0 0.0 0.0 82.0 73.0 0.0 0.0 0.0 43.0 132.0 82.0 95.0 | |
60d9992b10f6dd4da4dc53826b7433f5 0.0 0.0 0.0 0.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 | |
33468988848349138af5cb1c23b550f2 0.0 2.0 11.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 |
- 样本元数据(Metadata),本教程中文件名为 sample-metadata.tsv。该文件由分析者自己准备,用于描述各个样本的特征。
ID Samples Layer Depth Depth2 Location Position Site | |
F01 F01 0-5 5 05 cmbsf Turn Upstream F | |
F02 F02 5-9 10 10 cmbsf Turn Upstream F | |
F03 F03 9-13 15 15 cmbsf Turn Upstream F | |
F04 F04 13-17 15 15 cmbsf Turn Upstream F | |
F05 F05 17-22 20 20 cmbsf Turn Upstream F | |
F06 F06 22-26 25 25 cmbsf Turn Upstream F | |
H2_1 H2_1 0-5 5 05 cmbsf Left Upstream H2 | |
H2_2 H2_2 5-10 10 10 cmbsf Left Upstream H2 | |
H2_3 H2_3 10-15 15 15 cmbsf Left Upstream H2 | |
H2_4 H2_4 15-20 20 20 cmbsf Left Upstream H2 | |
H2_5 H2_5 20-25 25 25 cmbsf Left Upstream H2 | |
H2_6 H2_6 25-29 30 30 cmbsf Left Upstream H2 | |
I1_1 I1_1 0-5 5 05 cmbsf Left Upstream I1 | |
I1_2 I1_2 5-10 10 10 cmbsf Left Upstream I1 | |
I1_3 I1_3 10-15 15 15 cmbsf Left Upstream I1 | |
I1_4 I1_4 15-20 20 20 cmbsf Left Upstream I1 | |
I1_5 I1_5 20-25 25 25 cmbsf Left Upstream I1 | |
I1_6 I1_6 25-29 30 30 cmbsf Left Upstream I1 |
- 分类信息,本教程中文件名为 taxonomy.tsv。该文件可由 QIIME2 生成。
Feature ID Taxon Confidence | |
9e24eb7a415db9a59586d17d0f49cbea Archaea;Asgardarchaeota;Lokiarchaeia 0.9999999998216045 | |
2a1d71d9fca92f9b3fc8f3126db076d0 Bacteria;Proteobacteria;Gammaproteobacteria;Pseudomonadales;Pseudomonadaceae;Pseudomonas 0.9881304182870394 | |
5d89868f1a1db1bc0b153eca96bbf7fd Archaea;Crenarchaeota;Nitrososphaeria;Nitrosopumilales;Nitrosopumilaceae 0.9999999999859067 | |
cc957f2e853493d72875a6528ca83435 Archaea;Crenarchaeota;Nitrososphaeria;Nitrosopumilales;Nitrosopumilaceae 0.9999999999854506 | |
5179960239613d4c220e889075c6773e Archaea;Crenarchaeota;Nitrososphaeria;Nitrosopumilales;Nitrosopumilaceae;Candidatus Nitrosopumilus 0.9558707678091154 | |
d62ab321b324b106e11961e79384f974 Bacteria;Methylomirabilota;Methylomirabilia;Methylomirabilales;Methylomirabilaceae;wb1-A12 0.9999999975860316 | |
920aa9728ffb783cbc5721932cadda36 Bacteria;Aerophobota;Aerophobia;Aerophobales;uncultured bacterium 0.9999939600150409 | |
b5edcefd9280528ee377cb70dea8a6a7 Archaea;Asgardarchaeota;Lokiarchaeia;uncultured archaeon 0.99744406884555 | |
43b02d567fe419b94ad063081c7bba58 Bacteria;Planctomycetota;Brocadiae;Brocadiales;Scalinduaceae;Candidatus Scalindua;uncultured bacterium 0.9999941829048367 | |
0f1be1121dd04bc63b5ec4be0efc09b8 Archaea;Asgardarchaeota;Lokiarchaeia;uncultured archaeon 0.7884239553020901 | |
430d9115ca79bad01227bcc9c7694cf1 Bacteria;Proteobacteria;Gammaproteobacteria;Xanthomonadales;Xanthomonadaceae;Thermomonas;uncultured bacterium 0.7413321650122459 | |
0bf08973da329747d913d5c261f91944 Bacteria;Aerophobota;Aerophobia;Aerophobales 1.0000000000000024 |
- 进化树,本教程中文件名为 tree.nwk。该文件可由 QIIME2 生成,Newick 格式,是用代表序列构建的系统发育树。
# Alpha diversity
# Shannon、Richness、Simpson、Chao1、ACE、Pielou、PD_whole_tree 指数的计算与可视化
# 输入文件
- feature-table.tsv
- sample-metadata.tsv
# 第一步:计算多样性
将如下代码保存到文件”compute_alpha.R“中,并将程序与输入文件放在同一目录下。在终端中运行命令”Rscript compute_alpha.R“,得到输出文件”alpha.txt“。
#!/usr/bin/env R | |
#定义函数 | |
library(picante) #picante 包加载时默认同时加载 vegan | |
alpha <- function(x, tree = NULL, base = exp(1)) { | |
est <- estimateR(x) | |
Richness <- est[1, ] | |
Chao1 <- est[2, ] | |
ACE <- est[4, ] | |
Shannon <- diversity(x, index = 'shannon', base = base) | |
Simpson <- diversity(x, index = 'simpson') #Gini-Simpson 指数 | |
Pielou <- Shannon / log(Richness, base) | |
goods_coverage <- 1 - rowSums(x == 1) / rowSums(x) | |
result <- data.frame(Richness, Shannon, Simpson, Pielou, Chao1, ACE, goods_coverage) | |
if (!is.null(tree)) { | |
PD_whole_tree <- pd(x, tree, include.root = FALSE)[1] | |
names(PD_whole_tree) <- 'PD_whole_tree' | |
result <- cbind(result, PD_whole_tree) | |
} | |
result | |
} | |
#现在直接使用定义好的命令 alpha (),一步得到多种 Alpha 多样性指数 | |
#加载 OTU 丰度表和进化树文件 | |
otu <- read.delim('feature-table.tsv', row.names = 1, sep = '\t', stringsAsFactors = FALSE, check.names = FALSE) | |
otu <- t(otu) | |
tree <- read.tree('tree.nwk') | |
#不包含谱系多样性,无需指定进化树;Shannon 公式的 log 底数我们使用 2 | |
##alpha_all <- alpha(otu, base = 2) | |
#包含谱系多样性时,指定进化树文件;Shannon 公式的 log 底数我们使用 2 | |
alpha_all <- alpha(otu, tree, base = 2) | |
#输出保存在本地 | |
write.table(alpha_all, 'alpha.txt', sep="\t", quote = FALSE) |
# 第二步:制图
这一步需要在 Rstudio 中运行如下命令,在终端里直接运行会报错(莫名其妙),最终输出 7 个 PDF 图形文件。
#!/usr/bin/env R | |
# 基于 github 安装包,需要 devtools,检测是否存在,不存在则安装 | |
if (!requireNamespace("devtools", quietly = TRUE)) | |
install.packages("devtools") | |
# 加载 github 包安装工具 | |
library(devtools) | |
# 检测 amplicon 包是否安装,没有从源码安装 | |
if (!requireNamespace("amplicon", quietly = TRUE)) | |
install_github("liaochenlanruo/amplicon") | |
# 提示升级,选择 3 None 不升级;升级会容易出现报错 | |
# library 加载包,suppress 不显示消息和警告信息 | |
suppressWarnings(suppressMessages(library(amplicon))) | |
# 设置工作目录,根据实际情况设定 | |
setwd("用户自己的工作目录") | |
# 读取元数据,参数指定包括标题行 (TRUE),列名为 1 列,制表符分隔,无注释行,不转换为因子类型 | |
metadata = read.table("sample-metadata.tsv", header=T, row.names=1, sep="\t", comment.char="", stringsAsFactors = F) | |
# 读取第一步中 vegan 计算的 6 种 alpha 多样性指数 | |
#alpha_div = read.table("alpha.txt", header=T, row.names=1, sep="\t", comment.char="") | |
alpha_div <- read.delim("alpha.txt", quote="", stringsAsFactors=FALSE) | |
# 绘制各组香农指数分布,外层 () 可对保存的图形同时预览 | |
(p1 = alpha_boxplot(alpha_div, index = "Shannon", metadata, groupID = "Depth2")) | |
## 物种丰富度 Richness 指数 | |
(p2 = alpha_boxplot(alpha_div, index = "Richness", metadata, groupID = "Depth2")) | |
#Gini-Simpson 指数(我们平时常用的 Simpson 指数即为 Gini-Simpson 指数) | |
(p3 = alpha_boxplot(alpha_div, index = "Simpson", metadata, groupID = "Depth2")) | |
#Chao1 指数 | |
(p4 = alpha_boxplot(alpha_div, index = "Chao1", metadata, groupID = "Depth2")) | |
#ACE 指数 | |
(p5 = alpha_boxplot(alpha_div, index = "ACE", metadata, groupID = "Depth2")) | |
#Shannon 均匀度(Pielou 均匀度) | |
(p6 = alpha_boxplot(alpha_div, index = "Pielou", metadata, groupID = "Depth2")) | |
## 谱系多样性 | |
(p7 = alpha_boxplot(alpha_div, index = "PD_whole_tree", metadata, groupID = "Depth2")) | |
# 保存图片,指定图片为 pdf 格式方便后期修改,图片宽 89 毫米,高 75 毫米 | |
ggsave(paste0("alpha_boxplot_shannon.pdf"), p1, width=89, height=75, units="mm") | |
ggsave(paste0("alpha_boxplot_Richness.pdf"), p2, width=89, height=75, units="mm") | |
ggsave(paste0("alpha_boxplot_Simpson.pdf"), p3, width=89, height=75, units="mm") | |
ggsave(paste0("alpha_boxplot_Chao1.pdf"), p4, width=89, height=75, units="mm") | |
ggsave(paste0("alpha_boxplot_ACE.pdf"), p5, width=89, height=75, units="mm") | |
ggsave(paste0("alpha_boxplot_Pielou.pdf"), p6, width=89, height=75, units="mm") | |
ggsave(paste0("alpha_boxplot_PD_whole_tree.pdf"), p7, width=89, height=75, units="mm") |
# 演示视频
# 物种多样性条形图的绘制
# 输入文件
- 处理后的 Feature Table
从 QIIME2 可视化网站上下载的各 level 的物种丰度表,此处以 level-2(Phylum 水平)为例,命名为 “level-2.csv”。该文件可以用 excel 或 WPS 打开,然后复制所有内容至一个新建的名字为 “level-2.txt” 的文本文档中,删除无关的行或列(如路径),只保留丰度数据,并保存。格式如下:
index species1 species2 species3 species4 | |
Sample1 0 8152 11 65 | |
Sample2 12 97 1097 1315 | |
... | |
Samplex 15 46 2928 1011 |
- sample-metadata.tsv
- taxonomy.tsv
# 绘图
以下代码在 Rstudio 中逐步输入运行
setwd("用户自己的路径") | |
if (!requireNamespace("devtools", quietly=TRUE)) | |
install.packages("devtools") | |
library(devtools) | |
if (!requireNamespace("amplicon", quietly=TRUE)) | |
install_github("microbiota/amplicon") | |
suppressWarnings(suppressMessages(library(amplicon))) | |
# 从文件读取元数据,特征表和物种注释 | |
metadata=read.table("sample-metadata.tsv", header=T, row.names=1, sep="\t", comment.char="", stringsAsFactors=F) | |
taxonomy=read.table("taxonomy.tsv", header=T, row.names=1, sep="\t", comment.char="", stringsAsFactors=F) | |
otutab2=read.table("level-2.txt", header=T, row.names=1, sep="\t", comment.char="", stringsAsFactors=F) | |
#堆叠柱状图。以分组均值绘制,展示丰度最高的 19 个门,其余归类为其他 (Other) | |
# 门水平物种组成表和元数据作为输入,分组列名为 Group,默认显示前 19 个分类,按丰度排序 | |
otutab2=t(otutab2) | |
(ps=tax_stackplot(otutab2, metadata, groupID="Site", topN=20, style="sample", sorted="abundance")) | |
ps2 = ps + scale_fill_manual(values = rev(c("#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5"))) + theme(axis.text.x = element_text(angle = 90, hjust = 0.5, vjust = 0.5)) | |
ps2 |
# 演示视频
# Beta 多样性
# NMDS 分析及可视化
# 输入文件
- feature-table.tsv
- sample-metadata.tsv
# 分析过程
在 Rstudio 中运行如下代码:
setwd("用户的工作目录") | |
library("vegan") | |
# 读取数据,一份 otu.table 文件和一份分组信息文件 | |
otu <- read.table("feature-table.tsv",row.names=1, header=T,sep="\t",check.names=F) | |
design <- read.table("sample-metadata.tsv",header=T,sep="\t",row.names=1,check.names=F) | |
# 数据调整为列名是 OTU,行名是样本名 | |
otu=t(otu) | |
# 标准化,当然 method 有很多,可以通过?decostand 查看其它 method | |
vare.hel<-decostand(otu,method="hellinger") | |
# 计算 Bray-curtis 距离矩阵 | |
vare.dis <- vegdist(vare.hel,method="bray") | |
# 使用 NMDS 的方法 | |
vare.mds <- metaMDS(vare.hel,distance = "bray") | |
# 首先提取前两轴坐标 | |
point = scores(vare.mds) | |
# 将分组文件和得分文件合并 | |
index = merge(design, point,by="row.names",all=F) | |
# 查看 Stress 值 | |
# Stress 值是反映模型合适程度的指标,NMDS 会多次打乱数据计算 Stress 值,直到找到最合适的模型,也就是最低的 Stress 值;理想状况下,Stress 值为 0,一般 Stress 值低于 0.1 较为合理。 | |
vare.mds | |
# Stress: 0.07498046 #记住这个数字,后面会打印在图中 | |
# 显着性检验;anosim 本质是基于排名的算法,更加适合 NMDS,这里基于元数据中的深度(Depth)计算 | |
anosim.result<-anosim(vare.dis, design$Depth,permutations =999) | |
summary(anosim.result) | |
# ANOSIM statistic R: 0.8036 #记住这个数字,后面会打印在图中 | |
# Significance: 0.001 #记住这个数字,后面会打印在图中 | |
# tiff 输出图形,适合大部分出版刊物,入门级别分辩率 300,18*14 的长宽; | |
#tiff(file="beta_bray_NMDS.tiff", res = 300, compression ="none", width=180,height=140,units= "mm") | |
# 在这里我选择输出为 PDF,后续可以进一步的编辑 | |
pdf(file="beta_bray_NMDS.pdf", width=180,height=140) | |
#开始出图,代码如下: | |
library("ggplot2") | |
p = ggplot(index, aes(x=NMDS1, y=NMDS2, color=as.factor(Depth))) + | |
geom_point(size=0) + | |
#scale_colour_manual (values = c ("red","blue", "green")) +# 这行代码是用于自定义颜色的,有几个组就用几个颜色,少于 3 个组的话不支持自定义 | |
labs(x=paste("NMDS1"), y=paste("NMDS2"), title="") | |
#置信区间当然要加上,有三种方式,线条类型也可以更改。将上面得到的三个指标在图中更换 Stress,R,p。 | |
p+stat_ellipse(type = "t", linetype = 2, level = 0.95, show.legend = TRUE)+ | |
annotate("text",x=-2.5,y=-1.25,parse=TRUE,size=4,label="'R: '*0.8036",family="serif",fontface="italic",colour="darkred",hjust = 0)+ | |
annotate("text",x=-2.5,y=-1.35,parse=TRUE,size=4,label="'p: '*0.001",family="serif",fontface="italic",colour="darkred",hjust = 0)+ | |
annotate("text",x=-2.5,y=-1.45,parse=TRUE,size=4,label="'Stress: '*0.075",family="serif",fontface="italic",colour="darkred",hjust = 0) + geom_point(aes(x=NMDS1, y=NMDS2, shape=Site), size=2)+ | |
#scale_shape_manual (values = c (15, 19, 17))+# 这行代码是用于自定义形状的,有几个组就用几个形状,少于 3 个组的话不支持自定义 | |
theme_classic() | |
dev.off() |
# 演示视频
# 参考
- https://github.com/YongxinLiu/MicrobiomeStatPlot
敬告:使用文中脚本请引用本文网址,请尊重本人的劳动成果,谢谢!