其他
R语言绘制星形图示例
R语言绘制物种丰度星形图示例
第一次见到这种以星形图展示群落物种丰度的图,是在某公司的16S结题报告中。觉得挺有意思的,因此今天给大家分享一下星形图的作图方法。
与物种丰度饼图的解读方式类似,依据扇形区域的面积判断物种丰度的大小。与常规的饼图不同的地方在于,星形图中每块扇形区域的长度与该物种的丰度有关,而宽度相等(常规的物种丰度扇形图中每块扇形区域的长度等同,宽度与物种的丰度有关)。
本文使用的作图数据的网盘链接(提取码ahrw):
https://pan.baidu.com/s/14q_-7ftB39q9dk190i011Q
文件“phylum_top10.csv”由16S高通量测序所得的物种丰度表转化而来,展示了主要细菌类别(行)在各样本(列)中的丰度信息。我们将通过星形图,展示各样本中各细菌类别的丰度组成。
stars()绘制物种丰度星形图
R的stars()命令可用于绘制星形图,该命令在R启动时默认加载。我们使用stars()展示一个简单的星形图。
phylum_top10 <- read.csv('phylum_top10.csv', row.names = 1)
t_phylum_top10 <- data.frame(t(phylum_top10))
color <- c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5', 'gray')
stars(t_phylum_top10, scale = FALSE, draw.segments = TRUE, col.segments = color, nrow = 2, ylim = c(1, 2), key.loc = c(6, -1) , frame.plot = FALSE, main = 'Top10 Phylum')
ggplot2绘制物种丰度星形图
在ggplot2中,可通过绘制柱形图,然后经极坐标系转换得到星形图。下文继续简介星形图在ggplot2中的绘制方法。
library(reshape2)library(ggplot2)
#调整数据布局
phylum_top10$Taxonomy <- factor(rownames(phylum_top10), levels = rownames(phylum_top10))
phylum_top10_melt <- melt(phylum_top10, id = 'Taxonomy')
#以样本 c1 为例的星形图,单一柱形图的坐标转换
phylum_top10_c1 <- subset(phylum_top10_melt, variable == 'c1')
p_c1 <- ggplot(phylum_top10_c1, aes(Taxonomy, value, fill = Taxonomy)) +
geom_bar(stat = 'identity', width = 1) +
coord_polar(theta = 'x') +
scale_fill_manual(values = c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5', 'gray')) +
labs(x = '', y = '', title = 'Sample: c1', fill = 'Top10 Phylum') +
theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), plot.title = element_text(hjust = 0.5))
p_c1
上述展示了单一样本,这回再来个展示了所有样本的。效果很像一朵花。
p_all <- ggplot(phylum_top10_melt, aes(variable, value, fill = Taxonomy)) +
geom_bar(stat = 'identity', width = 0.6) +
coord_polar(theta = 'x') +
scale_fill_manual(values = c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5', 'gray')) +
labs(x = '', y = '', fill = 'Top10 Phylum') +
theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank())
p_all
若将横坐标设置为细菌种类名称,纵坐标设置为丰度数据,并按样本进行着色绘制星形图,可用于观测主要种群丰度由各样本的贡献情况。
p_sample <- ggplot(phylum_top10_melt, aes(Taxonomy, value, fill = variable)) +geom_bar(stat = 'identity', width = 0.6) +
coord_polar(theta = 'x') +
scale_fill_manual(values = c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5')) +
labs(x = '', y = '', title = 'Top10 Phylum', fill = 'Sample') +
theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), plot.title = element_text(hjust = 0.5))
p_sample
可以借助其它R包(如grid包)来实现对多张ggplot2单图的组合,获得stars()的星形图效果。以下是对本示例的效果。
library(grid)
#获取所有样本名称
sample_name <- levels(phylum_top10_melt$variable)
#创建画板,根据样本数(此处为 8 个)预设图片位置
#pdf('grid_plot.pdf', width = 9, height = 5)
png('grid_plot.png', width = 3000, height = 1500, res = 300, units = 'px')
grid.newpage()
n <- 8
split_x <- c(0.1, 0.3, 0.5, 0.7, 0.1, 0.3, 0.5, 0.7) #预设 8 张子图的横坐标
split_y <- c(0.6, 0.6, 0.6, 0.6, 0.1, 0.1, 0.1, 0.1) #预设 8 张子图的纵坐标
#使用循环,使用 ggplot2 分别绘制 8 个样本的物种丰度星形图,并放置在画板对应的位置中
for (i in 1:n) {
p_i <- ggplot(subset(phylum_top10_melt, variable == sample_name[i]), aes(Taxonomy, value, fill = Taxonomy)) +
geom_bar(stat = 'identity', width = 1) +
coord_polar(theta = 'x') +
scale_fill_manual(values = c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5', 'gray')) +
labs(title = paste('Sample:', sample_name[i]), y = '', x = '', fill = 'Top10 Phylum') +
theme(plot.background = element_blank(), panel.grid = element_blank(), panel.background = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), plot.title = element_text(hjust = 0.5))
print(p_i + theme(legend.position = 'none'), vp = viewport(x = split_x[i], y = split_y[i], width = 1, height = 0.8))
}
#该函数用于在 ggplot2 中提取图例,参考自 https://stackoverflow.com/questions/13712574/how-to-change-position-of-grid-draw
g_legend <- function(gg_plot) {
tmp <- ggplot_gtable(ggplot_build(gg_plot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == 'guide-box')
leg <- tmp$grobs[[leg]]
leg
}
#截取图例添加至组合图中
phylum_legend <- g_legend(p_i)
phylum_legend$vp$x <- unit(0.92, 'npc') #指定图例在 grid 画板中的横坐标位置
phylum_legend$vp$y <- unit(0.5, 'npc') #指定图例在 grid 画板中的纵坐标位置
grid.draw(phylum_legend)
dev.off()
对星形图的基本介绍今天就到这里了。