R语言 | 绘制堆叠柱形图示例
本篇将同样通过这类物种堆叠柱形图,分享在R中绘制堆叠柱形图的方法。
本文使用的作图数据的网盘链接(提取码 4ein):
https://pan.baidu.com/s/1FjrJMQBEN5xdBj2QERKbyA
文件“phylum_top10.csv”由16S高通量测序所得的物种丰度表转化而来,展示了主要细菌类群(行)在各样本(列)中的丰度信息。
barplot()绘制物种堆叠柱形图
barplot()为R中绘制柱形图的常用命令之一,R启动时默认加载。以下是使用barplot()绘制物种堆叠柱形图的一个简单示例,用于展示细菌类群组成丰度。
#读取数据
phylum_top10 <- read.csv('phylum_top10.csv', row.names = 1, stringsAsFactors = FALSE, check.names = FALSE)
#barplot() 作图,可使用 ?barplot 查看该命令详情
png('barplot_plot.png', width = 1000, height = 700)
par(xpd = TRUE, mar = par()$mar + c(1, 3, 1, 16))
barplot(as.matrix(100 * phylum_top10), col = c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5', 'gray'),
legend = rownames(phylum_top10),
cex.axis = 2, cex.names = 2, ylim = c(0, 100), las = 1, width = 0.5, space = 0.5, beside = FALSE,
args.legend = list(x = 'right', bty = 'n', inset = -0.18, cex = 2, y.intersp = 1.2, x.intersp = 0.7, text.width = 1))
mtext('Relative Abundance(%)', cex = 2, side = 2, line = 4)
dev.off()
ggplot2绘制物种堆叠柱形图
对于我个人来讲,大多数时候更喜欢使用ggplot2。与barplot()相比,ggplot2可调节性强,功能更为强大,且通用性强。以下简单展示ggplot2绘制物种堆叠柱形图的方法。
library(reshape2)
library(ggplot2)
#整理成 ggplot2 作图格式
phylum_top10$Taxonomy <- factor(rownames(phylum_top10), levels = rev(rownames(phylum_top10)))
phylum_top10 <- melt(phylum_top10, id = 'Taxonomy')
#添加分组,这次我们根据样本分组绘制分面
group <- read.delim('group.txt', sep = '\t', stringsAsFactors = FALSE)
names(group)[1] <- 'variable'
phylum_top10 <- merge(phylum_top10, group, by = 'variable')
#绘制带分面的柱状图
p <- ggplot(phylum_top10, aes(variable, 100 * value, fill = Taxonomy)) +
geom_col(position = 'stack', width = 0.6) +
facet_wrap(~group, scales = 'free_x', ncol = 2) +
scale_fill_manual(values = rev(c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5', 'gray'))) +
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.title = element_blank(), legend.text = element_text(size = 11))
#ggsave('ggplot2_plot.pdf', p, width = 8, height = 6)
ggsave('ggplot2_plot.png', p, width = 8, height = 6)
补充内容,关于ggplot2的柱形图参数,geom_col(position = 'stack')和geom_col(position = 'fill'),均可用于绘制堆叠柱形图,但是这两个参数的作图结果是不一样的。
#比方说我们剔除其中的“Others”,作为展示
phylum_top10_noothers <- subset(phylum_top10, Taxonomy != 'Others')
#参数 geom_col(position = 'stack')
ggplot(phylum_top10_noothers, aes(variable, value, fill = Taxonomy)) +
geom_col(position = 'stack', width = 0.6) +
labs(x = '', y = 'Relative Abundance')
#参数 geom_col(position = 'fill')
ggplot(phylum_top10_noothers, aes(variable, value, fill = Taxonomy)) +
geom_col(position = 'fill', width = 0.6) +
labs(x = '', y = 'Relative Abundance')
下图A为参数“geom_col(position = 'stack')”的作图结果,y轴展示原始计数,即作图数据中给定值为多少即展示多少,y轴取值最大值为作图数据中各样本中细菌类群丰度总和;B为“position = 'fill'”,首先再次将作图数据中每个类群的丰度除以其在各样本中的总丰度,即展示重新计算的比例,y轴值最大值默认为1。
以上分别展示了barplot()以及ggplot2绘制物种堆叠柱形图的2个简单示例。本篇作为简单介绍,更详细更复杂的绘制方法还需大家在实践中慢慢领悟了。