先前提到堆叠柱形图展示群落物种丰度以及细胞比例变化等等。与此相较,堆叠面积图是另一种可视化选择,特别是在大样本情形(此时柱状图不便展示很多的样本或分组数量)或者涉及“时间序列”的情形中。如下面的例子。所以在上次面积图的基础上,我们学习堆叠面积图的画法。
我们还是用一组微生物峰度数据作为测试数据。这组测试数据包含40多个微生物门类的峰度数据。
library(reshape2)
library(ggplot2)
phylum <- read.table("phylum_table.txt", row.names = 1, sep = "\t",header=T)
因为显示40多个不显示,所以我们挑选top 10的highlight,其余的作为others。
下面我们就按峰度加和排序。
phylum$sum <- rowSums(phylum)
phylum <- phylum[order(phylum$sum, decreasing = TRUE),]
phylum_top10 <- phylum[1:10, -ncol(phylum)] //选取前10行,除去最后一列的所有列
phylum_top10['Others', ] <- 1 - colSums(phylum_top10) //添加一行Others,值为1-列的总和。
下面我们load进去每个sample的时间点特征。为啥用时间点,不用sample。是因为在ggplot2中,由于堆叠面积图类似于折线图的延伸样式,因此横坐标必须为数值类型才能被识别,不可为因子或字符类型,不然不会出图。所以如果我们横轴设置为sample的话,是一个字符型,是不会出图的。
group <- read.table("group.txt", sep = "\t", header=T)
然后把时间点特征通过merge函数和我们的峰度矩阵合并。
merge(x, y, by = intersect(names(x), names(y)),by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,sort= TRUE, suffixes = c(".x",".y"),incomparables = NULL, ...)
merge函数参数的说明如下:
x,y:用于合并的两个数据框
by,by.x,by.y:指定依据哪些行合并数据框,默认值为相同列名的列.
all,all.x,all.y:指定x和y的行是否应该全在输出文件.
sort:by指定的列是否要排序.
suffixes:指定除by外相同列名的后缀.
incomparables:指定by中哪些单元不进行合并.
phylum_top10 <- merge(phylum_top10, group, by = 'sample', all.x = TRUE)
下面,我们就可以画堆积面积图了。
ggplot(phylum_top10, aes(x = times, y = 100*value, fill = Taxonomy)) +
geom_area() +
labs(x = 'Times', y = 'Relative Abundance(%)', title = '', fill = 'Top10 Phylum')
我们再来调整一下色系和布局等等。
ggplot(phylum_top10, aes(x = times, y = 100*value, fill = Taxonomy)) +
geom_area() +
labs(x = 'Times', y = 'Relative Abundance(%)', title = '', fill = 'Top10 Phylum')+
scale_fill_manual(values = c('gray', 'skyblue', 'burlywood1', 'purple', 'cyan', 'hotpink', 'red', 'yellow', 'green', 'orange', 'blue')) + #设置颜色
theme(panel.grid = element_blank(), #去除网格线
panel.background = element_rect(color = 'black', fill = 'transparent')) + #调整背景
scale_x_continuous(breaks = 1:15, labels = as.character(1:15), expand = c(0, 0)) + #调整坐标轴轴刻度
scale_y_continuous(expand = c(0, 0)) #去除上下的留白
但是我们又测试了一个参数group。
ggplot(phylum_top10,aes(x = sample,y =100*value,group=Taxonomy,fill = Taxonomy))+
#stat_summary(geom = 'line',fun='mean',cex=1,col='white')+
geom_area(data =phylum_top10,aes(fill=Taxonomy))+
labs(x = 'Times', y = 'Relative Abundance(%)', title = '', fill = 'Top10 Phylum')+
scale_fill_manual(values = c('gray', 'skyblue', 'burlywood1', 'purple', 'cyan', 'hotpink', 'red', 'yellow', 'green', 'orange', 'blue')) + #设置颜色
theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent')) + #调整背景
scale_y_continuous(expand = c(0, 0))
这次就可以用sample正常显示了。我还没搞清楚具体的原因和逻辑,囧。