成品图:
Rplot.png思路
数据-预处理-计算距离-pcoa处理-画图
所需数据:
OTU聚类表
otu.png分组表,根据研究目的和作图需求,把OTU表的每一项数据都分类。
如例图,按颜色分12类
颜色.png
按形状分为两类
形状.png
备注
pcoa分析作图最主要的思想就是分类,按照实验设计和数据进行分类。比如例子中有两组实验:大豆组(soybean)和玉米组(maize),每组实验有12个不同的处理方法:CF,CH,CK...而进行pcoa分析的目的就是要直观的看出实验组和对照组之间的区别,所以首先要对实验组进行分组(分为soybean组和maize组)其次对不同的处理方法进行分类(CF,CH...)。
而在绘图时,有两个参数用来直观的区别不同的内容,颜色和形状。对于组数少的分组进行形状区分,对于组数多的进行颜色区分。即该例中不同的实验组用形状区分,不同的处理方法用颜色区分。
预处理
。对于OTU表:去掉其他内容,只留OTU列和所有的聚类列
。新建两个分组表,第一列为OTU表中各个聚类的名字,第二列为分组名称
用R处理数据
#载入需要用到的包
> library(vegan)
> library(ggplot2)
> library(ggrepel)
> library(openxlsx)
#读取数据
> group_s <- read.xlsx("C:/Users/RNG/Desktop/shape.xlsx",sheet = 1)#形状分组数据
> group_c <- read.xlsx("C:/Users/RNG/Desktop/group.xlsx",sheet = 1)#颜色分组数据
> df <- read.xlsx("C:/Users/RNG/Desktop/OTU2.xlsx",sheet = 1)#OTU数据
#对OTU表预处理:将第一列OTU序号变为行名后删除。因为下一步需要转置OTU表,而第一列OTU序号为字符型,在转置后会将全部的数据变为字符型,所以需要该步处理
> rownames(df) <- df$OTU#将df数据框中的OTU列变为df的行名
> df1 <- df[,-1]#删去df数据框的第一列并输入给新的数据框df1
> df1 <- t(df1)#转置
> group_c$group <- as.factor(group_c$group)#将分组列转换为因子类型,以便于画图时使用
> group_s$shape <- as.factor(group_s$shape)#同上
#数据处理——计算距离
> distance <- vegdist(df1,method = "bray")#使用vegdist函数计算距离(需要计算的数据,method=“所计算的距离类型,通常为bray”)
#数据处理——pcoa分析
> pcoa <- cmdscale(distance,k=2,eig = TRUE)#使用cmdscale函数进行pcoa分析(上一步计算的距离,k=需要降维到几维通常为2维,eig=TRUE为返回eig值下面计算置信区间需要用到)
> plot_data <- data.frame({pcoa$points})#将上步pcoa分析结果中的points转换为数据框并赋值给plot_data,该数据在画图时需要使用
> eig <- pcoa$eig#将pcoa处理返回结果中的eig赋值,下面计算置信区间需要用到
> data <- data.frame(group_c$group,group_s$shape,plot_data)#将两个分组列和经过pcoa处理后的point数据整合赋值给data以便于画图使用
> names(data) <- c("c","s","PCoA1",'PCoA2')#对data列命名
#画图
>ggplot(data=data,aes(x=PCoA1,y=PCoA2,shape=s,color=c))#基础图层,(数据,映射(x=数据中作为x的列,y=数据中y的列,shape=数据中按形状分组的列,color=数据中按颜色分组的列))
+geom_point(alpha=1,size=2)#geom-point函数为散点图函数,(alpha控制图形的半透明度,越小越透明,size控制点的大小)
+stat_ellipse(aes(fill=s),type = "norm",geom="polygon",alpha=0.2,color=NA)#stat-ellipse为绘制椭圆的函数(aes(fill=你想用椭圆圈住的分组列,例子中圈主的是形状),type=椭圆对应的概率分布,默认为t分布,norm为多元分布,geom=控制图形的几何对象,通常为polygon,color=椭圆边界颜色)
+labs(x=paste("PCoA1(",format(100*eig[1]/sum(eig),digits = 4),"%)",sep=""),y=paste("PCoA2(",format(100*eig[2]/sum(eig),digits = 4),"%)",sep=""))#labs函数为给图形横纵轴加标签,100*eig[2]/sum(eig)为计算置信度的公式
+geom_vline(aes(xintercept=0),linetype="dotted")#添加参考线,也就是例子中的虚线,vline为纵向参考线,hline为横向,xintercept=为参考线与x轴的交点,linetype="dotted"为虚线
+geom_hline(aes(yintercept=0),linetype="dotted")
+theme(panel.background = element_rect(fill='white',colour = 'black'),axis.title.x=element_text(colour = 'black',size=20),axis.title.y = element_text(colour = 'black',size=20),legend.text = element_text(size = 15))#theme函数控制背景参数,panel.background为画布参数设置,fill为背景颜色,colour为图边框颜色。axis.title.x=element_text(colour = 'black',size=20),axis.title.y = element_text(colour = 'black',size=20)为设置坐标轴标签文本的颜色大小。legend.text = element_text(size = 15)为设置图中示例的文字大小
网友评论