ixxmu / mp_duty

抓取网络文章到github issues保存
https://archives.duty-machine.now.sh/
112 stars 30 forks source link

使用R语言绘制物种堆叠柱形图、面积图、冲击图并展示样本环境梯度 #4416

Closed ixxmu closed 8 months ago

ixxmu commented 8 months ago

https://mp.weixin.qq.com/s/E76H5gqBK2TLbNJv0A4CpQ

ixxmu commented 8 months ago

使用R语言绘制物种堆叠柱形图、面积图、冲击图并展示样本环境梯度 by 小白鱼的生统笔记

使用R语言绘制物种堆叠柱形图、面积图、冲击图并展示样本环境梯度

堆叠柱形图堆叠面积图冲击图(桑基图)等都是用来展示各样本中物种丰度组成的常见可视化方法......算了没啥可说的,本篇就是偷懒,炒冷饭水推文......另外在一些涉及时间序列的采样观测或具有明显环境变化的情形中,经常还会选择根据时间或者环境梯度对样本进行排序后作图,来更好地展示物种组成以及相对丰度的时空变化趋势,如下所示的这样,并在下方添加个色阶来表示时间或环境梯度。


 

然后下文简单展示使用Rggplot2绘制上述所说的物种堆叠柱形图、堆叠面积图、冲击图。

下文中所使用的示例数据或代码的百度盘链接(提取码,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-99种生物类群的相对丰度。


接下来作图展示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)


友情链接

常见的统计图


柱形图:频数直方图    堆叠柱形图    分组柱形图    双向柱形图    蝴蝶图
箱线图:箱线图    配对箱线图    提琴图    密度提琴图    带分位数的提琴图
饼图:饼图和扇形图    蜘蛛饼图    圆环图    旭日图    星形图
散点图:二维散点图    三维散点图    密度散点图    PCA    抖动散点图和蜂群图    气泡图    
折线或曲线图:密度曲线    折线图    回归曲线    平行坐标图
集合可视化:韦恩图    花瓣图    UpSet    网络图可视化交集    
相关性可视化:相关散点图    相关矩阵图    相关气泡图    相关热图    偏相关热图    Mantel相关组合图
面积图:堆叠面积图    峰峦图
树形图:物种树    聚类树    PCA+聚类树     Treemap
网络和流:网络图    冲击图    桑基图    弧线图
其它:雷达图    词云    词频图    森林图

微生物组常用图


微生物丰度组成:物种堆叠柱形图    物种堆叠面积图    物种丰度热图    物种丰度饼图    物种丰度弦图    物种丰度三元图    聚类树+物种堆叠柱形图    地图+物种组成丰度饼图  
物种分类树或进化树:Krona    metacoder可视化    Cytoscape可视化    进化树+类群丰度饼图    
微生物互作网络:phyloseq可视化    Cytoscape可视化    Gephi可视化    物种互作弦图    
微生物多样性:稀释曲线/α多样性指数曲线    Rank-abundance曲线    物种累积曲线     β多样性相异矩阵热图    PCA/RDA排序图