查看原文
其他

R语言绘制星形图示例

生信小白鱼 鲤小白 小白鱼的生统笔记 2022-05-08


R语言绘制物种丰度星形图示例


    第一次见到这种以星形图展示群落物种丰度的图,是在某公司的16S结题报告中。觉得挺有意思的,因此今天给大家分享一下星形图的作图方法。

    与物种丰度饼图的解读方式类似,依据扇形区域的面积判断物种丰度的大小。与常规的饼图不同的地方在于,星形图中每块扇形区域的长度与该物种的丰度有关,而宽度相等(常规的物种丰度扇形图中每块扇形区域的长度等同,宽度与物种的丰度有关)。

   

    本文使用的作图数据的网盘链接(提取码ahrw):

    https://pan.baidu.com/s/14q_-7ftB39q9dk190i011Q

    文件“phylum_top10.csv”由16S高通量测序所得的物种丰度表转化而来,展示了主要细菌类别(行)在各样本(列)中的丰度信息。我们将通过星形图,展示各样本中各细菌类别的丰度组成。


stars()绘制物种丰度星形图

  

    R的stars()命令可用于绘制星形图,该命令在R启动时默认加载。我们使用stars()展示一个简单的星形图。

#stars() 作图,可使用 ?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()的星形图效果。以下是对本示例的效果。

##一个 ggplot2 的多图组合样式,借助 grid 包完成
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()


    对星形图的基本介绍今天就到这里了。





您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存