其他
R语言绘制双向柱状图示例
今天就分享这个示例,简介使用R语言ggplot2包绘制这类双向柱状图的方法。
本文使用的作图数据的网盘链接(提取码 9k8h):
https://pan.baidu.com/s/1ZWeLGExlYTRKeGm3XqHLfw
作图数据“30days.csv”、“45days.csv”等,共计5个文件,分别对应不同取样时期。每个文件中,记录了该采样时期下处理组(Treat)与对照组(Control)植物茎长(stem_length)和根长(root_length)数据。
ggplot2绘制分组双向柱状图
该数据中带有分组(时期),所以可以称它为分组双向柱状图,绘制该图的同时也顺便将之前介绍过的“分组柱形图”回顾一下了。
首先读入5个作图文件,并按5个时期将植物长势数据合并。
#读入数据,合并数据plant30 <- read.csv('30days.csv')
plant30$days <- rep('30', nrow(plant30))
plant45 <- read.csv('45days.csv')
plant45$days <- rep('45', nrow(plant45))
plant60 <- read.csv('60days.csv')
plant60$days <- rep('60', nrow(plant60))
plant75 <- read.csv('75days.csv')
plant75$days <- rep('75', nrow(plant75))
plant90 <- read.csv('90days.csv')
plant90$days <- rep('90', nrow(plant90))
plant_all <- rbind(plant30, plant45, plant60, plant75, plant90)
再根据采样时期、处理分组以及植物部位,求长势数据均值以及标准差。
library(reshape2)library(doBy)
#统计均值、标准差
plant_all <- melt(plant_all, id = c('plant', 'days'))
plant_all_stat <- summaryBy(value~variable+plant+days, plant_all, FUN = c(mean, sd))
最后导入ggplot2包,绘制带有误差棒的柱状图。
library(ggplot2)#首先将根长数据转化为负值,便于作图
plant_all_stat[which(plant_all_stat$variable == 'root_length'), c('value.mean', 'value.sd')] <- plant_all_stat[which(plant_all_stat$variable == 'root_length'), c('value.mean', 'value.sd')] * -1
#ggplot2 作图
p1 <- ggplot(plant_all_stat, aes(days, value.mean, fill = plant)) +
geom_col(position = position_dodge(width = 0.5), width = 0.5, size = 0.3, colour = 'black') +
geom_errorbar(aes(ymin = value.mean - value.sd, ymax = value.mean + value.sd), width = 0.3, size = 0.3, position = position_dodge(0.5)) +
theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), legend.title = element_blank()) +
labs(x = 'Time (days)', y = 'Length (cm)') +
geom_hline(yintercept = 0, size = 0.3) +
scale_y_continuous(breaks = seq(-45, 45, 15), labels = as.character(abs(seq(-45, 45, 15))), limits = c(-45, 45)) +
annotate('text', label = 'Stem', 1, 43) +
annotate('text', label = 'Root', 1, -43)
#ggsave('plant.pdf', p1, width = 6, height = 4)
ggsave('plant.png', p1, width = 6, height = 4)
ggplot2绘制堆叠双向柱状图
除了上述分组类型的双向柱状图,还有堆叠式双向柱状图。
我们再以前文“堆叠柱形图”中的数据为例,展示一个示例,同样地,顺便也回顾一下堆叠柱状图。我们将展示先前数据中两个分组的样本中,各微生物类群在同时期时的比较。
##堆叠双向柱状图#读取数据
phylum_top10 <- read.csv('phylum_top10.csv', row.names = 1, stringsAsFactors = FALSE, check.names = FALSE)
#整理成 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')
#将 Control 转为负值
phylum_top10[which(phylum_top10$group == 'Control'), 'value'] <- phylum_top10[which(phylum_top10$group == 'Control'), 'value'] * -1
#ggplot2 作图
p2 <- ggplot(phylum_top10, aes(times, 100 * value, fill = Taxonomy)) +
geom_col(position = 'stack', width = 0.5) +
scale_fill_manual(values = rev(c('#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5', 'gray'))) +
labs(x = '', y = 'Control Relative Abundance(%) Treat') +
geom_hline(yintercept = 0, size = 0.3) +
scale_y_continuous(breaks = seq(-100, 100, 25), labels = as.character(abs(seq(-100, 100, 25)))) +
scale_x_continuous(breaks = 1:6, labels = as.character(1:6)) +
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)) +
coord_flip()
#ggsave('taxonomy.pdf', p2, width = 9, height = 5.5)
ggsave('taxonomy.png', p2, width = 9, height = 5.5)
本篇分别通过两个示例,简要展示了分组式双向柱状图和堆叠式双向柱状图的绘制方法。在这些数据中,包含了两组可认作是“相反含义”的数据(植物地上/地下部分,试验处理/对照组),因此我们可以分别在正向和反向两个坐标轴中展示它们,使结果更加形象。同样地,双向柱状图不适合不含相反含义的数据。
友情链接