科研星球

R语言统计与绘图:双向柱状图

ggplot2绘制双向柱状图
    双向柱状图(又名正负条形图),使用正向和反向的柱子显示类别之间的数值比较。双向柱状图包含正向和反向两个坐标轴,每个柱子可以表示一个正向数据和一个反向数据。
    来个示例展示一下吧。在温室中进行盆栽试验,该试验在土壤中添加某种化学物质,观察该化学物质对植物长势的影响。分别在植物生长的第30、45、60、75、90天时取样观察,测量植物的长势,包括茎长和根长两个指标。如下图这种,我们将茎长和根长两个指标分别展示在y轴的两个方向,比较起来是不是很形象?

下载.jpeg

  

    今天就分享这个示例,简介使用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)

下载.jpeg


图片

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)

640.jpeg



    本篇分别通过两个示例,简要展示了分组式双向柱状图和堆叠式双向柱状图的绘制方法。在这些数据中,包含了两组可认作是“相反含义”的数据(植物地上/地下部分,试验处理/对照组),因此我们可以分别在正向和反向两个坐标轴中展示它们,使结果更加形象。同样地,双向柱状图不适合不含相反含义的数据。



没有账号?