R语言绘制带聚类树的堆叠柱形图

聚类树与柱形图结合,即可反映样本或分组间的相似性,又能展示样本内的元素组成信息。

例如下图是一个在扩增子测序微生物群落分析中常见的统计图类型,在测序公司给的报告中通常都有这么一张图。聚类树表示了各样本或分组之间,物种丰度组成的相似性或相异程度;柱形图就是常见的物种堆叠柱形图,常用于表示代表性的门纲目科属等丰度,如下图中即展示了各样本中丰度排名前10的细菌门的丰度信息。

很容易看出,该图主体由两部分组成,聚类树+堆叠柱形图。

本篇分享怎样在R语言中绘制。

示例数据,R代码等的百度盘链接:

https://pan.baidu.com/s/1mcn3XCma9_0C2LpDVytYsg

作图示例文件

文件“phylum_top10.txt”由16S高通量测序所得的物种丰度表计算得到,记录了丰度排名top10的主要细菌类群(在门水平统计,行)在各样本(12个样本,列)中的丰度信息。Top10丰度外的类群合并为Others。

“group.txt”为12个样本的分组信息。

通过这两个文件绘制带聚类树的堆叠柱形图。

R语言作图

首先进行层次聚类,获得代表样本间物种组成相似性的聚类树,这一步很简单。

#层次聚类
#读取 OTU 丰度表
dat <- read.delim('phylum_top10.txt', row.names = 1, sep = '\t', head = TRUE, check.names = FALSE)#计算样本间距离,以群落分析中常用的 Bray-curtis 距离为例
dis_bray <- vegan::vegdist(t(dat), method = 'bray')#层次聚类,以 UPGMA 为例
tree <- hclust(dis_bray, method = 'average')
treeplot(tree)

接下来就是对聚类树进行调整。

具体做法,首先定义一个画板,将聚类树放在画板的左侧,并按样本的已知分组信息给分支上色。聚类树的一些常见的可视化调整方法,可参考前文。

##聚类树绘制
#样本分组颜色、名称等
group <- read.delim('group.txt', row.names = 1, sep = '\t', head = TRUE, check.names = FALSE, stringsAsFactors = FALSE)
grp <- group[2]
group_col <- c('red', 'blue')
names(group_col) <- c('1', '2')
group_name <- c('Control', 'Treat')#样本分组标签
layout(t(c(1, 2, 2, 2, 3)))
par(mar = c(5, 2, 5, 0))plot(0, type = 'n', xaxt = 'n', yaxt = 'n', frame.plot = FALSE, xlab = '', ylab = '',xlim = c(-max(tree$height), 0), ylim = c(0, length(tree$order)))
legend('topleft', legend = group_name, pch = 15, col = group_col, bty = 'n', cex = 1)#聚类树绘制,按分组给分支上色
treeline <- function(pos1, pos2, height, col1, col2) {meanpos = (pos1[1] + pos2[1]) / 2segments(y0 = pos1[1] - 0.4, x0 = -pos1[2], y1 = pos1[1] - 0.4, x1 = -height,  col = col1,lwd = 2)segments(y0 = pos1[1] - 0.4, x0 = -height,  y1 = meanpos - 0.4, x1 = -height,  col = col1,lwd = 2)segments(y0 = meanpos - 0.4, x0 = -height,  y1 = pos2[1] - 0.4, x1 = -height,  col = col2,lwd = 2)segments(y0 = pos2[1] - 0.4, x0 = -height,  y1 = pos2[1] - 0.4, x1 = -pos2[2], col = col2,lwd = 2)
}meanpos = matrix(rep(0, 2 * length(tree$order)), ncol = 2)
meancol = rep(0, length(tree$order))
for (step in 1:nrow(tree$merge)) {if(tree$merge[step, 1] < 0){pos1 <- c(which(tree$order == -tree$merge[step, 1]), 0)col1 <- group_col[as.character(grp[tree$labels[-tree$merge[step, 1]],1])]} else {pos1 <- meanpos[tree$merge[step, 1], ]col1 <- meancol[tree$merge[step, 1]]}if (tree$merge[step, 2] < 0) {pos2 <- c(which(tree$order == -tree$merge[step, 2]), 0)col2 <- group_col[as.character(grp[tree$labels[-tree$merge[step, 2]],1])]} else {pos2 <- meanpos[tree$merge[step, 2], ]col2 <- meancol[tree$merge[step, 2]]}height <- tree$height[step]treeline(pos1, pos2, height, col1, col2)meanpos[step, ] <- c((pos1[1] + pos2[1]) / 2, height)if (col1 == col2) meancol[step] <- col1 else meancol[step] <- 'grey'
}

按分组给聚类树的分支或簇标记了颜色,放置在画板左侧的一小部分区域。

对于右侧区域,放置堆叠柱形图,用以展示top10丰度的细菌门在各样本中的丰度信息。堆叠柱形图单独的画法,可参考该文。

##堆叠柱形图
#样本顺序调整为和聚类树中的顺序一致
dat <- dat[ ,tree$order]#物种颜色设置
phylum_color <- c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5', 'gray')
names(phylum_color) <- rownames(dat)#堆叠柱形图
par(mar = c(5, 2, 5, 0))bar <- barplot(as.matrix(dat), col = phylum_color, space = 0.4, width = 0.7, cex.axis = 1, horiz = TRUE, cex.lab = 1.2,xlab = 'Relative Abundance', yaxt = 'n', las = 1, ylim = c(0, ncol(dat)), family = 'mono')# 注意:百度云链接中的代码将tree$order打错为test_order,请在运行中报错自行修改
mtext('Top 10 phylums', side = 3, line = 1, cex = 1)
text(x = -0.05, y = bar, labels = colnames(dat), col = group_col[group[tree$order, 2]], xpd = TRUE)

首先按聚类树中样本的顺序重新调整丰度表中样本的顺序,以保持二者能够对应,并定义颜色属性。之后绘制堆叠柱形图,放置在画板右侧区域。

最后在最右侧添加柱形图图例,哪些颜色代表了哪种细菌类群。

#柱形图图例
par(mar = c(5, 1, 5, 0))
plot(0, type = 'n', xaxt = 'n', yaxt = 'n', bty = 'n', xlab = '', ylab = '')
legend('left', pch = 15, col = phylum_color, legend = names(phylum_color), bty = 'n', cex = 1)

这样这种带聚类的堆叠柱形图就搞定了。

其它说明

如果觉得使用R组合两张图比较麻烦,特别是细节部分不容易调整,不妨分别绘制聚类树和堆叠柱形图,然后使用AI、PS等工具将二者拼合在一起,可能相对方便许多。再略加修整,也会更好看。

猜你喜欢

10000+:菌群分析 宝宝与猫狗 梅毒狂想曲 提DNA发Nature Cell专刊 肠道指挥大脑

系列教程:微生物组入门 Biostar 微生物组  宏基因组

专业技能:学术图表 高分文章 生信宝典 不可或缺的人

一文读懂:宏基因组 寄生虫益处 进化树

必备技能:提问 搜索  Endnote

文献阅读 热心肠 SemanticScholar Geenmedical

扩增子分析:图表解读 分析流程 统计绘图

16S功能预测   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在线工具:16S预测培养基 生信绘图

科研经验:云笔记  云协作 公众号

编程模板: Shell  R Perl

生物科普:  肠道细菌 人体上的生命 生命大跃进  细胞暗战 人体奥秘

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外5000+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。PI请明示身份,另有海内外微生物相关PI群供大佬合作交流。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍未解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

点击阅读原文,跳转最新文章目录阅读

R语言绘制带聚类树的堆叠柱形图相关推荐

  1. 在线作图|你不知道的绘制带聚类树的堆叠柱状图的方法

    Question1:什么是堆叠柱状图? 柱形图用来比较两个或多个的含量或者丰度(不同时间或者不同条件),只有一个变量,通常适用于于较小的数据集分析,堆叠柱形图是柱形图的变形,可以清晰地比较某一个维度数 ...

  2. 使用R语言绘制层次聚类热图

    R语言绘制热图--pheatmap_宁生信-CSDN博客_r语言热图pheatmap: Pretty Heatmaps--Implementation of heatmaps that offers ...

  3. R语言绘制带误差线的条形图

    条形统计图是用一个单位长度表示一定的数量,根据数量的多少画成长短不同的直条.带误差的条形图可以通过误差线来判断显著性. 继续使用我们的汽车销售数据(公众号回复:汽车销售,可以获得该数据)来演示,先导入 ...

  4. R 语言绘制带组的圆形条形图

    圆形条形图是一种条形图,其中条形图沿圆形而不是线显示.本页旨在教您如何制作带有组的圆形条形图. 第一步是建立一个圆形的条形图,圆圈中有一个中断.实际上,我只是在初始数据框的末尾添加了几行空行: # l ...

  5. R语言绘制散点图和边际图(柱形图,小提琴图)

    官方网站请查阅: https://www.r-graph-gallery.com/277-marginal-histogram-for-ggplot2 散点图作为一种展示2组连续变量关系的常用可视化方 ...

  6. R语言绘制环形树状图

    R语言绘制环形树状图 1.主要用到dendextend和circlize包绘图: library(dendextend) library(circlize)# 距离矩阵 d <- dist(US ...

  7. 使用R语言自带的茑尾花(iris)数据集,绘制鸢尾花的萼片的长度和宽度的散点图并添加不同品种花萼长度与花萼宽度的回归直线。不同的品种用不同的颜色,x轴为花萼长度

    1使用R语言自带的茑尾花(iris)数据集,绘制鸢尾花的萼片的长度和宽度的散点图并添加不同品种花萼长度与花萼宽度的回归直线.不同的品种用不同的颜色,x轴为花萼长度(单位:cm),y轴为花萼宽度(单位: ...

  8. R语言绘制布林带通道

    使用R语言绘制布林带通道. 其基本含义为: 所使用的公式为: 参数给个定值,看个具体的示例: 函数的语法格式: 显示布林带通道: 使用的函数addBBands的语法: 欢迎交流:

  9. R语言绘制热图实践(一)pheatmap包

    目录 前言 pheatmap包 pheatmap简介 常用参数介绍 使用 安装 绘制样本间相关系数图(简单使用) 差异表达基因热图(进阶使用) 如何查看pheatmap的聚类结果 pheatmap总结 ...

最新文章

  1. 简单图文配置golang+vscode【win10/centos7+golang helloworld+解决install failed等情况】
  2. RavenDB FS 安装使用 介绍
  3. protractor端到端测试简介
  4. Android年月日选择,Android日期选择器实现年月日三级联动
  5. 中心对称又是轴对称的图形_2020广东省考行测备考:图形推理之对称知多少
  6. @程序员,你真的懂数据可视化吗?
  7. 易错点:C 语言 continue while for 循环
  8. 『运筹OR帷幄』——60w运筹学|优化理论|人工智能|数据科学的技术原创和交流社区...
  9. vue中利用高德地图选取经纬度
  10. python如何提交作业_用python 实现录入学生作业情况的小程序
  11. 第三方支付网银支付流程
  12. spring学期总结
  13. 服务器远程登录用户在哪查看,RAKsmart VNC用户登录信息在哪查看?
  14. 建筑工地人脸识别门禁通道闸机如何安装 1
  15. php 细表格,使用PHP轻松地创建一个表格 - 小俊学习网
  16. Centos7.4配置与管理DNS服务器
  17. STM32理论 —— DAC、DMA
  18. 算法中的P问题、NP问题、NP难问题和NP完全问题
  19. java段落对齐_Java 设置Word段落缩进、对齐方式
  20. 【论文笔记】Vision Transformer for Small-Size Datasets

热门文章

  1. 拼多多java开发一面、二面合并面经
  2. ZooKeeper最佳指南--云平台技术栈11
  3. 7个珍藏多年的网站,颠覆你的想象,值得收藏起来!
  4. 生产管理要点:快执行、高品质、看板追踪!
  5. 树莓派~ubuntu开机自启动
  6. Python操作Firefox
  7. ♥看二本学渣如何进腾讯 分享面试经验、职场感悟、硬核知识、大厂内推♥
  8. linux shell 读取文件 笔记
  9. 投影幕布jsp_投影 篇一:实测亲证百元投影幕布不如白墙
  10. python杨辉三角居中_python打印杨辉三角的两种方法及详解