条形图简介
在SCI论文的数据图表中,作者习惯于用条形图来表示分类数据的分布特征。在ggplot2中,条柱对应的几何对象函数为geom_bar()
, 它的功能就是展示计数数据,即每种分类水平一共有多少个观测值。
条形图分类
在ggplot2中,通常使用的条柱排列方式有三种,并排式(dodge)、堆栈式(stack)和填充式(fill)。
并排式:内部不同水平的大小比较
堆栈式:横向比较
填充式:纵向比较
使用条形图注意事项
•不要将条形图和直方图混淆,直方图仅反映数值型变量及其分布。
•对条形图的柱子进行排序!
•如果一个分组有多个观测值,不要使用条形图。即使带有error bars,它会隐藏数据分布的很多信息,这时候考虑箱线图或小提琴更合适。
绘图代码
绘图的背景数据来自于生信小白鱼的R语言绘制分组柱状图示例(链接在文末)。
library(ggplot2)
library(cowplot)
library(RColorBrewer)
#读取数据
stat <- read.csv('stat.csv', stringsAsFactors = FALSE)
head(stat)
# group taxonomy mean se sign1 sign2
#1 t2 Acidobacteria 0.07900818 0.014288334 a
#2 t2 Actinobacteria 0.09357735 0.010600036
#3 t2 Alphaproteobacteria 0.23973385 0.013647304 c
#4 t2 Bacteroidetes 0.06632490 0.007760726 a
#5 t2 Betaproteobacteria 0.08499788 0.006444345 a
#6 t2 Gammaproteobacteria 0.25456864 0.034769642 a
#可以给细菌类群按丰度高低排个序
stat$taxonomy<-factor(stat$taxonomy, levels = c('Alphaproteobacteria', 'Gammaproteobacteria', 'Actinobacteria', 'Acidobacteria', 'Betaproteobacteria', 'Bacteroidetes'))
#将小数类型的相对丰度乘以 100 方便以百分比展示
stat$mean <- stat$mean * 100
stat$se <- stat$se * 100
#利用geom_bar()绘制并排式条形图——'dodge'
p1 <- ggplot(stat, aes(taxonomy, weight = mean, fill = group)) +
geom_hline(yintercept = seq(10, 50, 10), color = 'gray') +
geom_bar(color = "black", width = .7, position = 'dodge') +
geom_errorbar(aes(ymin = mean - se, ymax = mean + se), width = 0.25, size = 0.3, position = position_dodge(0.7)) +
labs( y = 'Relative abundance (%)') +
scale_fill_brewer(palette = "Set3")+
scale_y_continuous(expand = c(0,0)) +
theme_classic()
#利用geom_bar()绘制堆栈式条形图——'stack'
p2 <- ggplot(stat, aes
(taxonomy, weight = mean, fill = group)) +
geom_hline(yintercept = seq(25, 100, 25), color = 'gray') +
geom_bar(color = "black", width = .7, position = 'stack') +
labs( y = 'Relative abundance (%)') +
scale_fill_brewer(palette = "Set3")+
scale_y_continuous(expand = c(0,0)) +
theme_classic()
#利用geom_bar()绘制填充式条形图——'fill'
p3 <- ggplot(stat, aes(group, weight = mean, fill = taxonomy)) +
geom_bar(color = "black", width = .7, position = 'fill') +
labs( y = 'Relative abundance (%)') +
scale_fill_brewer(palette = "Set3")+
scale_y_continuous(expand = c(0,0)) +
theme_classic()
plot_grid(p1, p2, p3, nrow = 3, labels = letters[1:3], align = c("v", "h"))
结果如图所示