查看原文
其他

R语言绘制双向柱状图示例

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

  

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


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



友情链接

  

R语言绘制分组柱状图

R语言绘制堆叠面积图

R语言绘制堆叠柱状图

R语言绘制星形图

R语言绘制圆环图

R语言绘制饼图(扇形图)

R语言绘制花瓣图

R语言绘制韦恩图

韦恩图在线绘制网站





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

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