查看原文
其他

R可视化——如何为散点图添加置信区间或者分组圈?

王志山 科研后花园 2023-09-08

     在文献阅读过程中其实很容易见到那种在散点图中添加分组圈或者置信区间的图片,比如PCA分析、PCoA分析、NMDS分析等。这篇推文主要给大家展示如何使用R语言进行散点图置信区间的添加或者分组圈的添加!

散点图的绘制

      这里,小编以PCoA分析为例哈,至于怎么进行PCoA分析及相关细节大家可参考此前推文。首先,我们现根据数据进行PCoA分析并绘制基础的散点图:

#设置工作环境rm(list=ls())setwd("D:/test")#加载包library(vegan)#计算距离时需要的包library(ggplot2)#绘图包#读取数据,一般所需是数据行名为样本名、列名为OTUxxx的数据表otu_raw <- read.table(file="otu.txt",sep="\t",header=T,check.names=FALSE ,row.names=1)#由于排序分析函数所需数据格式原因,需要对数据进行转置otu <- t(otu_raw)#计算bray_curtis距离otu.distance <- vegdist(otu)#pcoa分析pcoa <- cmdscale (otu.distance,eig=TRUE)pc12 <- pcoa$points[,1:2]pc <- round(pcoa$eig/sum(pcoa$eig)*100,digits=2)#解释度#pc12原来是matrix,转化为data.framepc12 <- as.data.frame(pc12)#给pc12添加samp1es变量pc12$samples <- row.names(pc12)#读入分组文件group <- read.table("group.txt", sep='\t', header=T)#修改列名colnames(group) <- c("samples","group")#将绘图数据和分组合并df <- merge(pc12,group,by="samples")head(df)#组间差异性分析df_anosim <- anosim(otu.distance,df$group,permutations = 999)#绘图color=c("#1597A5","#FFC24B","#FEB3AE")#颜色变量p1<-ggplot(data=df,aes(x=V1,y=V2,color=group))+#指定数据、X轴、Y轴,颜色 theme_bw()+#主题设置 geom_point(size=3)+#绘制点图并设定大小 theme(panel.grid = element_blank())+ geom_vline(xintercept = 0,lty="dashed",size=0.8)+ geom_hline(yintercept = 0,lty="dashed",size=0.8)+#图中虚线 labs(x=paste0("PC1 (",pc[1],"%)"), y=paste0("PC2 (",pc[2],"%)"))+#将x、y轴标题改为贡献度 geom_text(aes(x=0.4,y=-0.2),label=paste("R=",round(df_anosim$statistic,3)),color="black",size=4)+ geom_text(aes(x=0.4,y=-0.23),label=paste("p=", round(df_anosim$signif,3)),color="black",size=4)+ scale_color_manual(values = color) +#点的颜色设置 theme(axis.title.x=element_text(size=12),#修改X轴标题文本 axis.title.y=element_text(size=12,angle=90),#修改y轴标题文本 axis.text.y=element_text(size=10),#修改x轴刻度标签文本 axis.text.x=element_text(size=10),#修改y轴刻度标签文本 panel.grid=element_blank())#隐藏网格线p1

添加置信区间

       置信区间的添加一般是添加95%置信度水平上的置信区间,这里使用stat_ellipse函数进行添加,这也是常用的一种添加方式,该函数中通过参数level可设置置信度水平,其他一些细节设置可自行探索,通过scale_fill_manual可对其填充色进行设置,具体如下:

p1+stat_ellipse(data=df, geom = "polygon",level=0.9, linetype = 1,size=0.8, aes(fill=group), alpha=0.1, show.legend = T)+ scale_fill_manual(values = c("#1597A5","#FFC24B","#FEB3AE"))

添加分组圈

     分组圈的添加其实相对于置信区间而言就没有那么多要求,只是起到辨别分组的作用,所以我们只要将目标点包括在圈中即可,这里主要介绍两种方法:

1、基于ggalt包添加:

library(ggalt)p1+geom_encircle(aes(group = group,fill=group),expand=0,spread=0.5,s_shape=1,size=3,linetype = 1,alpha=0.2)+ scale_fill_manual(values = c("#1597A5","#FFC24B","#FEB3AE"))

2、基于ggforce包添加:

library(ggforce)p1+geom_mark_rect(aes(fill=group))+ scale_fill_manual(values = c("#1597A5","#FFC24B","#FEB3AE"))

整体代码

#设置工作环境rm(list=ls())setwd("D:/test")#加载包library(vegan)#计算距离时需要的包library(ggplot2)#绘图包#读取数据,一般所需是数据行名为样本名、列名为OTUxxx的数据表otu_raw <- read.table(file="otu.txt",sep="\t",header=T,check.names=FALSE ,row.names=1)#由于排序分析函数所需数据格式原因,需要对数据进行转置otu <- t(otu_raw)#计算bray_curtis距离otu.distance <- vegdist(otu)#pcoa分析pcoa <- cmdscale (otu.distance,eig=TRUE)pc12 <- pcoa$points[,1:2]pc <- round(pcoa$eig/sum(pcoa$eig)*100,digits=2)#解释度###绘图####pc12原来是matrix,转化为data.framepc12 <- as.data.frame(pc12)#给pc12添加samp1es变量pc12$samples <- row.names(pc12)#读入分组文件group <- read.table("group.txt", sep='\t', header=T)#修改列名colnames(group) <- c("samples","group")#将绘图数据和分组合并df <- merge(pc12,group,by="samples")#组间差异性分析df_anosim <- anosim(otu.distance,df$group,permutations = 999)#绘图color=c("#1597A5","#FFC24B","#FEB3AE")#颜色变量p1<-ggplot(data=df,aes(x=V1,y=V2,color=group))+#指定数据、X轴、Y轴,颜色 theme_bw()+#主题设置 geom_point(size=3)+#绘制点图并设定大小 theme(panel.grid = element_blank())+ geom_vline(xintercept = 0,lty="dashed",size=0.8)+ geom_hline(yintercept = 0,lty="dashed",size=0.8)+#图中虚线 labs(x=paste0("PC1 (",pc[1],"%)"), y=paste0("PC2 (",pc[2],"%)"))+#将x、y轴标题改为贡献度 geom_text(aes(x=0.4,y=-0.2),label=paste("R=",round(df_anosim$statistic,3)),color="black",size=4)+ geom_text(aes(x=0.4,y=-0.23),label=paste("p=", round(df_anosim$signif,3)),color="black",size=4)+ scale_color_manual(values = color) +#点的颜色设置 theme(axis.title.x=element_text(size=12),#修改X轴标题文本 axis.title.y=element_text(size=12,angle=90),#修改y轴标题文本 axis.text.y=element_text(size=10),#修改x轴刻度标签文本 axis.text.x=element_text(size=10),#修改y轴刻度标签文本 panel.grid=element_blank())#隐藏网格线p1
####添加置信区间##基于stat_ellipse函数添加p2 <- p1+stat_ellipse(data=df, geom = "polygon",level=0.9, linetype = 1,size=0.8, aes(fill=group), alpha=0.1, show.legend = T)+ scale_fill_manual(values = c("#1597A5","#FFC24B","#FEB3AE"))p2########只是起到标识作用##基于ggalt包添加library(ggalt)p3 <- p1+geom_encircle(aes(group = group,fill=group),expand=0,spread=0.5,s_shape=1,size=3,linetype = 1,alpha=0.2)+ scale_fill_manual(values = c("#1597A5","#FFC24B","#FEB3AE"))p3##ggforce包添加library(ggforce)p4 <- p1+geom_mark_rect(aes(fill=group))+ scale_fill_manual(values = c("#1597A5","#FFC24B","#FEB3AE"))p4
#拼图cowplot::plot_grid(p1,p2,p3,p4,ncol = 2)

如果大家需要源码及数据,可在后台回复"置信区间"获取!

爱我请给我好看!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存