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

群落堆叠柱状图示例文件
1.某一分类级别丰度文件:


图片.png

2.分组文件:


图片.png

OK,接下来开始绘制:

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

#准备一下颜色信息 因为属或种水平物种比较多,可以多准备一些
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)
  1. 准备作图文件
  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')

  1. 普通柱状图绘制
#普通柱状图
  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)

图片.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)
图片.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
图片.png

~~当然有时候我们不会单画某一个层级的图,很多层级都需要做的时候,一行行的回车简直累死,此时我们就可以将上边代码写在函数里运行会方便许多的
如下示例,可能还有更方便的请自行摸索:
写个函数作图:

#导入文件
input_file <- read.delim('Single_Phylum.txt',row.names = 1,sep = '\t',stringsAsFactors = FALSE)
Bar_plot <- function(input_file,top){
  #中间代码和上面一样 ‘从加载包到保存的代码’
}
Bar_plot(phylum = input_file,top = 20) #导出top前20的物种出图

除此之外还有一种方式是批量的循环作图
假设文件夹下有各个层级的丰度表如下:

图片.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)
}
图片.png

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

下面是刚创建个人公众号,会定时更新R、linux、python,组学方面的学习内容,请多多支持呦~~


image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341