Closed ixxmu closed 8 months ago
堆叠柱形图、堆叠面积图、冲击图(桑基图)等都是用来展示各样本中物种丰度组成的常见可视化方法......算了没啥可说的,本篇就是偷懒,炒冷饭水推文......另外在一些涉及时间序列的采样观测或具有明显环境变化的情形中,经常还会选择根据时间或者环境梯度对样本进行排序后作图,来更好地展示物种组成以及相对丰度的时空变化趋势,如下所示的这样,并在下方添加个色阶来表示时间或环境梯度。
然后下文简单展示使用R包ggplot2绘制上述所说的物种堆叠柱形图、堆叠面积图、冲击图。
下文中所使用的示例数据或代码的百度盘链接(提取码,s18i):
https://pan.baidu.com/s/1Qbn8utcZ9YbM8PJwUvx-GQ
若百度盘失效,也可在GitHub的备份中获取:
https://github.com/lyao222lll/sheng-xin-xiao-bai-yu-2024
示例数据
网盘附件“taxonomy.txt”,记录了29个采样样本的9种生物类群的相对丰度数据。
sample,样本名称;temperature,温度梯度;class1-9,9种生物类群的相对丰度。
接下来作图展示9个生物类群在样本中的xiangdui丰度分布情况。
分别展示堆叠柱形图、堆叠面积图、冲击图(桑基图)的绘制方法,样本顺序根据温度由小到大排序,以便查看类群组成和丰度随温度增加的变化情况。
物种丰度堆叠柱形图
我们首先将上述示例数据读取到R中,根据温度由小到大对样本排序后,绘制物种堆叠柱形图。图中横坐标代表不同样本(或分组),纵坐标代表了生物类群的相对丰度,不同颜色代表不同生物类群组成。由于样本是按温度排序的,不妨再在横坐标下方添加一个热图表示各样本温度梯度的色阶。
library(reshape2)
library(ggplot2)
library(patchwork)
#读取数据
dat <- read.delim('taxonomy.txt', stringsAsFactors = FALSE)
#按温度梯度对样本排序
dat <- dat[order(dat$temperature), ]
dat$NO <- 1:nrow(dat)
#转换为长列表格式便于 ggplot2 作图
dat <- melt(dat, id = c('NO', 'sample', 'temperature'))
#绘制物种丰度堆叠柱形图
p_bar <- ggplot(dat, aes(x = NO, y = value, fill = variable)) +
geom_col() +
scale_fill_manual(limits = c('class1', 'class2', 'class3', 'class4', 'class5', 'class6', 'class7', 'class8', 'class9'),
values = c('#9FCBE2', '#2D83BE', '#B3E08B', '#2FA128', '#FFE69A', '#FF8000', '#E41316', '#D22FF6', '#6A3A9B')) +
theme(panel.grid = element_blank(),
panel.background = element_rect(color = 'black', fill = 'white', size = 0.5),
axis.ticks = element_line(color = 'black', size = 0.5),
axis.text.x = element_text(color = 'black', size = 9),
axis.text.y = element_text(color = 'black', size = 9),
axis.title.y = element_text(color = 'black', size = 10),
legend.text = element_text(color = 'black', size = 9),
legend.title = element_text(color = 'black', size = 10)) +
scale_x_continuous(breaks = unique(dat$NO), labels = unique(dat$sample), expand = expansion(mult = c(0.05, 0.05))) +
scale_y_continuous(expand = c(0, 0)) +
labs(x = '', y = 'Relative abundance', fill = 'Taxonomy')
p_bar
#绘制热图展示样本的温度梯度
p_temperature <- ggplot(dat, aes(x = NO, y = 1, fill = temperature)) +
geom_tile() +
scale_fill_gradientn(colors = colorRampPalette(c('#FAD9BA', '#C00216'))(20)) +
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.ticks.x = element_line(color = 'black', size = 0.5),
axis.ticks.y = element_blank(),
axis.text.x = element_text(color = 'black', size = 9),
axis.text.y = element_blank(),
legend.text = element_text(color = 'black', size = 9),
legend.title = element_text(color = 'black', size = 10)) +
scale_x_continuous(breaks = unique(dat$NO), labels = unique(dat$sample), expand = expansion(mult = c(0.05, 0.05))) +
scale_y_continuous(expand = expansion(mult = c(0, 0))) +
labs(x = '', y = '', fill = 'Temperature')
p_temperature
#将样本的温度梯度热图添加在丰度的堆叠柱形图下方
layout <- c(
area(1, 1, 14, 10),
area(15, 1, 15, 10)
)
p_bar + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) +
p_temperature + plot_layout(design = layout)
物种丰度堆叠面积图
堆叠面积图是另一种可视化选择,在样本较多的情形(此时柱状图不便展示很多的样本或分组数量)或者涉及时间或环境梯度的情形中,更好地呈现各生物类群组成和丰度的变化趋势。
#绘制物种丰度堆叠面积图
p_area <- ggplot(dat, aes(x = NO, y = value, fill = variable)) +
geom_area() +
scale_fill_manual(limits = c('class1', 'class2', 'class3', 'class4', 'class5', 'class6', 'class7', 'class8', 'class9'),
values = c('#9FCBE2', '#2D83BE', '#B3E08B', '#2FA128', '#FFE69A', '#FF8000', '#E41316', '#D22FF6', '#6A3A9B')) +
theme(panel.grid = element_blank(),
panel.background = element_rect(color = 'black', fill = 'white', size = 0.5),
axis.ticks = element_line(color = 'black', size = 0.5),
axis.text.x = element_text(color = 'black', size = 9),
axis.text.y = element_text(color = 'black', size = 9),
axis.title.y = element_text(color = 'black', size = 10),
legend.text = element_text(color = 'black', size = 9),
legend.title = element_text(color = 'black', size = 10)) +
scale_x_continuous(breaks = unique(dat$NO), labels = unique(dat$sample), expand = expansion(mult = c(0.05, 0.05))) +
scale_y_continuous(expand = c(0, 0)) +
labs(x = '', y = 'Relative abundance', fill = 'Taxonomy')
p_area
#将刚才绘制的样本的温度梯度热图添加在丰度的堆叠面积图下方
p_area + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) +
p_temperature + plot_layout(design = layout)
物种丰度冲击图(桑基图)
不过堆叠面积图里面的丰度变化曲线“不平滑”,不妨使用冲击图代替。另外冲击图也可添加在堆叠柱形图中,以更好地呈现在连续的时间或环境梯度下,各生物类群组成和丰度的变化趋势。
library(ggalluvial)
#绘制物种丰度冲击图代替堆叠面积图
p_flow1 <- ggplot(dat, aes(x = NO, y = value, fill = variable, alluvium = variable)) +
geom_flow(alpha = 1, width = 0) +
scale_fill_manual(limits = c('class1', 'class2', 'class3', 'class4', 'class5', 'class6', 'class7', 'class8', 'class9'),
values = c('#9FCBE2', '#2D83BE', '#B3E08B', '#2FA128', '#FFE69A', '#FF8000', '#E41316', '#D22FF6', '#6A3A9B')) +
theme(panel.grid = element_blank(),
panel.background = element_rect(color = 'black', fill = 'white', size = 0.5),
axis.ticks = element_line(color = 'black', size = 0.5),
axis.text.x = element_text(color = 'black', size = 9),
axis.text.y = element_text(color = 'black', size = 9),
axis.title.y = element_text(color = 'black', size = 10),
legend.text = element_text(color = 'black', size = 9),
legend.title = element_text(color = 'black', size = 10)) +
scale_x_continuous(breaks = unique(dat$NO), labels = unique(dat$sample), expand = expansion(mult = c(0.05, 0.05))) +
scale_y_continuous(expand = c(0, 0)) +
labs(x = '', y = 'Relative abundance', fill = 'Taxonomy')
p_flow1
#将刚才绘制的样本的温度梯度热图添加在丰度的冲击图下方
p_flow1 + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) +
p_temperature + plot_layout(design = layout)
#物种丰度堆叠柱形图+冲击图
p_flow2 <- ggplot(dat, aes(x = NO, y = value, fill = variable, stratum = variable, alluvium = variable)) +
geom_stratum(width = 0.7) +
geom_flow(alpha = 0.5) +
scale_fill_manual(limits = c('class1', 'class2', 'class3', 'class4', 'class5', 'class6', 'class7', 'class8', 'class9'),
values = c('#9FCBE2', '#2D83BE', '#B3E08B', '#2FA128', '#FFE69A', '#FF8000', '#E41316', '#D22FF6', '#6A3A9B')) +
theme(panel.grid = element_blank(),
panel.background = element_rect(color = 'black', fill = 'white', size = 0.5),
axis.ticks = element_line(color = 'black', size = 0.5),
axis.text.x = element_text(color = 'black', size = 9),
axis.text.y = element_text(color = 'black', size = 9),
axis.title.y = element_text(color = 'black', size = 10),
legend.text = element_text(color = 'black', size = 9),
legend.title = element_text(color = 'black', size = 10)) +
scale_x_continuous(breaks = unique(dat$NO), labels = unique(dat$sample), expand = expansion(mult = c(0.05, 0.05))) +
scale_y_continuous(expand = c(0, 0)) +
labs(x = '', y = 'Relative abundance', fill = 'Taxonomy')
p_flow2
#将刚才绘制的样本的温度梯度热图添加在丰度的冲击图下方
p_flow2 + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) +
p_temperature + plot_layout(design = layout)
常见的统计图
微生物组常用图
https://mp.weixin.qq.com/s/E76H5gqBK2TLbNJv0A4CpQ