群落堆叠柱状图+冲击图绘制

简介: 群落堆叠柱状图+冲击图绘制

群落堆叠柱状图+冲击图绘制


群落堆叠柱状图示例文件

1. 某一分类级别丰度文件:

image.png

2.分组文件:

image.png

接下来开始绘制:

准备一下颜色信息 因为属或种水平物种比较多,可以多准备一些

#准备一下颜色信息 因为属或种水平物种比较多,可以多准备一些
library(RColorBrewer)
rm(list = ls())
m1 = brewer.pal(9,"Set1")
m2 = brewer.pal(12,"Set3")
Palette1 <- c("#B2182B","#E69F00","#56B4E9","#009E73","#F0E442","#0072B2","#D55E00","#CC79A7","#CC6666","#9999CC","#66CC99","#999999","#ADD1E5")
Palette2 <- c('blue', 'orange', 'green', 'yellow', 'red', 'hotpink', 'cyan','purple', 'burlywood1','skyblue','grey','#8b8378','#458b74','#f0ffff','#eeb422','#ee6aa7','#8b3a62','#cd5c5c','#ee6363','#f0e68c','#e6e6fa','#add8e6','#bfefff','#f08080','#d1eeee','#7a8b8b','#8b814c','#8b5f65','gray')
mix <- c(m1,Palette2,Palette1,m2)

准备作图文件

phylum <- read.delim('test.txt',row.names = 1,sep = '\t',stringsAsFactors = FALSE)
 #过滤平均丰度大于0.001的物种
  phylum_filter <- phylum[rowMeans(phylum)>0.001,] 
  phylum_filter$sum <- rowSums(phylum_filter)
  #求各类群的丰度总和,并排序
  phylum_filter <-  phylum_filter[order(phylum_filter$sum,decreasing = TRUE),]
  #删除最后一列和,并取Top10物种作图
  phylum_top10 <- phylum_filter[c(1:10),-ncol(phylum_filter)]
 # 剩余的物种合并为Others
  phylum_top10['Others',] <- 1-colSums(phylum_top10)
 #最后一个设置为灰色
  colour <- mix[1:nrow(phylum_top10)]
  #个人喜欢将最后一个设置为灰色,也就是Others
  colour[length(colour)] <- 'gray' 
 #设置因子,改为长格式
  phylum_top10$Taxonomy <- factor(rownames(phylum_top10),levels = rev(rownames(phylum_top10)))
  phylum_top10 <- melt(phylum_top10,id = 'Taxonomy')
  #添加分组 合并信息
  group <- read.delim('sample.txt', sep = '\t', stringsAsFactors = FALSE)
  names(group)[1] <- 'variable'
  phylum_top10 <- merge(phylum_top10, group, by = 'variable')

普通柱状图绘制

#普通柱状图
  p1 <- ggplot(phylum_top10, aes(variable, 100 * value, fill = Taxon)) +
    #facet_wrap(~group,scales = 'free_x',ncol = 2)+
    geom_col(position = 'stack', width = 0.6)  +
    scale_fill_manual(values =  rev(c(colour))) +
    theme_classic()+scale_y_continuous(expand = c(0,0))+
    labs(x = '', y = 'Relative Abundance(%)')+
    theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), strip.text = element_text(size = 12)) +
    theme(axis.text = element_text(size = 12), axis.title = element_text(size = 13), legend.text = element_text(size = 11),legend.background = element_blank())
#小技巧若之前没有设置value*100,纵轴变为百分比形式可用scale_y_continuous(labels = scales::percent),同时添加上%
#更多theme细节可自行调节
  p1
  ggsave('Genu.pdf',p1,height = 7,width = 8)

image.png

冲击图绘制

p2 <- ggplot(data = phylum_top10,aes(x = variable, y = value*100, alluvium = Taxonomy, stratum = Taxonomy))+
    geom_alluvium(aes(fill = Taxonomy),alpha = .5,width = 0.5)+ 
    geom_stratum(aes(fill = Taxonomy),width = 0.5)+scale_fill_manual(values = rev(c(colour)))+
    theme_classic()+scale_y_continuous(expand = c(0,0))+
    labs(x = '', y = 'Relative Abundance(%)')+
    geom_flow(alpha = 0.5)+ #设置透明度
    theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), strip.text = element_text(size = 12)) +
    theme(axis.text = element_text(size = 12), axis.title = element_text(size = 13), legend.text = element_text(size = 11),legend.background = element_blank())
  p2
ggsave('Genu.pdf',p2,height = 7,width = 12)

image.png

合并起来作图

有时候我们不想看各个样品的组成情况,可以通过求和或者求均值的情况,将组合并只看俩组均值丰度的比较情况

#分组画图
  phylum_top10$D <- rowMeans(phylum_top10[,1:6])
  phylum_top10$H <- rowMeans(phylum_top10[,7:12])
  phylum_top10 <- select(phylum_top10,D,H)
  colour <- mix[1:nrow(phylum_top10)]#设置对应属的个数
  colour[length(colour)] <- 'gray' #最后一个设置为灰色
  phylum_top10$Taxonomy <- factor(rownames(phylum_top10),levels = rev(rownames(phylum_top10)))
  phylum_top10 <- melt(phylum_top10,id = 'Taxonomy')
#作图 普通柱状图
  p1 <- ggplot(phylum_top10, aes(variable, 100 * value, fill = Taxonomy)) +
    #facet_wrap(~group,scales = 'free_x',ncol = 2)+
    geom_col(position = 'stack', width = 0.6)  +
    scale_fill_manual(values =  rev(c(colour))) +
    theme_classic()+scale_y_continuous(expand = c(0,0))+
    labs(x = '', y = 'Relative Abundance(%)')+
    theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), strip.text = element_text(size = 12)) +
    theme(axis.text = element_text(size = 12), axis.title = element_text(size = 13), legend.text = element_text(size = 11))
  p1
#冲击图
 p2 <- ggplot(data = phylum_top10,aes(x = variable, y = value*100, alluvium = Taxonomy, stratum = Taxonomy))+
    geom_alluvium(aes(fill = Taxonomy),alpha = .5,width = 0.5)+ 
    geom_stratum(aes(fill = Taxonomy),width = 0.5)+scale_fill_manual(values = rev(c(colour)))+
    theme_classic()+scale_y_continuous(expand = c(0,0))+
    labs(x = '', y = 'Relative Abundance(%)')+
    #geom_flow(alpha = 0.5)+ #设置透明度
    theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), strip.text = element_text(size = 12)) +
    theme(axis.text = element_text(size = 12), axis.title = element_text(size = 13), legend.text = element_text(size = 11),legend.background = element_blank())
  p2

image.png

除此之外还有一种方式是批量的循环作图

假设文件夹下有各个层级的丰度表如下:

image.png

写个循环一次性展示各层级平均物种丰度大于1%的物种:

temp=list.files(path="./",pattern="Single.*.txt") #匹配文件
dir.create('plot',recursive = TRUE) # 创建出图的目录
#循环遍历
for (i in 1:length(temp)){
  phylum <- read.delim(temp[i],row.names = 1,sep = '\t',stringsAsFactors = FALSE)
  phylum_filter <- phylum[rowMeans(phylum)>0.01,]#筛选
  phylum_filter$sum <- rowSums(phylum_filter)#求各类群的丰度总和,并排序
  phylum_filter <- phylum_filter[order(phylum_filter$sum,decreasing = TRUE),]
  #phylum_filter <- phylum_filter[!grepl('unclassi',rownames(phylum_filter)),]#可以去除unclassified的物种
  phylum_top10 <- phylum_filter[1:nrow(phylum_filter),-ncol(phylum_filter)]
  phylum_top10['Others',] <- 1-colSums(phylum_top10)
  colour <- mix[1:nrow(phylum_top10)]#设置对应属的个数
  colour[length(colour)] <- 'gray' #最后一个设置为灰色
  phylum_top10$Taxonomy <- factor(rownames(phylum_top10),levels = rev(rownames(phylum_top10)))
  phylum_top10 <- melt(phylum_top10,id = 'Taxonomy')
  #添加分组
  group <- read.delim('sample.txt', sep = '\t', stringsAsFactors = FALSE)
  names(group)[1] <- 'variable'
  phylum_top10 <- merge(phylum_top10, group, by = 'variable')
  id <- strsplit(temp[i],split = '.t')[[1]][1]  #提取id 方便后面保存
  # 或者id <- unlist(strsplit(temp[i],split = '.t'))[1]
  #普通柱状图
  p1 <- ggplot(phylum_top10, aes(variable, 100 * value, fill = Taxonomy)) +
    #facet_wrap(~group,scales = 'free_x',ncol = 2)+
    geom_col(position = 'stack', width = 0.6)  +
    scale_fill_manual(values =  rev(c(colour))) +
    theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), strip.text = element_text(size = 12)) +
    theme(axis.text = element_text(size = 12), axis.title = element_text(size = 13), legend.title = element_blank(), legend.text = element_text(size = 11))+
    theme_classic()+scale_y_continuous(expand = c(0,0))+
    labs(x = '', y = 'Relative Abundance(%)')
  #facet_wrap(~Group, scales = 'free_x', ncol = 2) 
  #theme(axis.text.x=element_text(colour="black",size=12,face = "bold",angle = -90,vjust = 0.5,hjust = 0)) 
  # theme(text = element_text(family = "Times"))
  p1
  ggsave(paste('plot1/Taxa_bar1_',id,'.tiff',sep = ''),p1,height = 7,width = 8)
  #冲击图
  p2 <- ggplot(data = phylum_top10,aes(x = variable, y = value*100, alluvium = Taxonomy, stratum = Taxonomy))+
    geom_alluvium(aes(fill = Taxonomy),alpha = .5,width = 0.6)+ 
    geom_stratum(aes(fill = Taxonomy),width = 0.6)+scale_fill_manual(values = rev(c(colour)))+
    theme_classic()+scale_y_continuous(expand = c(0,0))+
    labs(x = '', y = 'Relative Abundance(%)')+
    theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), strip.text = element_text(size = 12)) +
    theme(axis.text = element_text(size = 12), axis.title = element_text(size = 13), legend.text = element_text(size = 11))
  p2
  ggsave(paste('plot1/Taxa_bar2_',id,'.tiff',sep = ''),p2,height = 7,width = 10)
}

image.png

好啦 出图成功,Nice!大家也试试吧!

相关文章
R实战 | 对称云雨图 + 箱线图 + 配对散点 + 误差棒图 +均值连线
R实战 | 对称云雨图 + 箱线图 + 配对散点 + 误差棒图 +均值连线
1505 1
R实战 | 对称云雨图 + 箱线图 + 配对散点 + 误差棒图 +均值连线
|
7月前
|
存储 数据可视化 关系型数据库
绘制圆环图/雷达图/星形图/极坐标图/径向图POLAR CHART可视化分析汽车性能数据
绘制圆环图/雷达图/星形图/极坐标图/径向图POLAR CHART可视化分析汽车性能数据
|
7月前
|
数据处理
分面中嵌入趋势线
分面中嵌入趋势线
71 1
|
7月前
|
Python
matplotlib绘制动态瀑布图
matplotlib绘制动态瀑布图
|
C++ Python
Python绘制比例直方柱状比重图
Python绘制比例直方柱状比重图
228 1
Python绘制比例直方柱状比重图
hcharts堆叠柱形图
hcharts堆叠柱形图
44 0
hcharts实现堆叠柱形图
hcharts实现堆叠柱形图
37 0
|
存储 数据可视化 数据处理
ggalluvial | 冲击图/ 桑基图绘制
ggalluvial | 冲击图/ 桑基图绘制
258 0
|
数据挖掘
这图怎么画| 批量小提琴图+箱线图+散点+差异分析
这图怎么画| 批量小提琴图+箱线图+散点+差异分析
339 0
|
数据可视化
R绘图 | 云雨图+双向条形图
R绘图 | 云雨图+双向条形图
164 0