柱状堆叠图或称条形堆叠图,是一类展示数据结果的重要统计绘图,常用于展示不同样本中微生物的群落组成,在sci文章的数据分析结果中使用频率非常高,有很多在线的网站或者统计软件均能绘制。在R语言中,也有很多包可绘制,比如graphics包barplot()函数和ggplot2包geom_bar()函数。 在这篇文章中,我们给大家讲解使用barplot()函数绘制柱状堆叠图的一些细则和使用技巧,以及提供一个绘制美观的堆叠柱状图的R代码。
barplot()函数基本使用
barplot()函数的基本使用参数:
barplot(height, width = 1, space = NULL,
names.arg = NULL, legend.text = NULL, beside = FALSE,
horiz = FALSE, density = NULL, angle = 45,
col = NULL, border = par("fg"),
main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
axes = TRUE, axisnames = TRUE,
cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
add = FALSE, ann = !add && par("ann"), args.legend = NULL, ...)
height为进行绘图的数据;
width定义bar的宽度;
space定义不同bar之间的间隔;
names.arg定义每一个bar下方的名称,如果为NULL则默认为数据中的列名;
legend.text定义legend中的名称,默认为数据中的行名;
beside定义绘图方式,FALSE为堆叠图,TRUE为并列图;
horiz定义绘图方式,FALSE为纵向绘图,TRUE为横向绘图;
density为底纹的密度;
angle为底纹的倾斜角度;
col为定义条形填充颜色;
border定义条形边框颜色,NA为去除边框;
main和sub定义标题和副标题;
xlab和ylab定义x和y轴的名称;
xlim和ylim定义x和y轴的界限;
xpd定义是否允许bar超过图像的范围;
log定义数据是否需要log转换;
axes定义是否需要显示垂直的或水平的轴;
axisnames是否显示轴的名字;
cex.axis和cex.names定义轴标签和bar表现的大小;
inside当space为0时,相邻bar之间是否用线间隔;
plot是否绘图;
axis.lty定义轴的线型;
add定义bar是否是添加进一个已有的图像中;
args.legend应用list函数通过legend命令的参数调整图例。
#创建一个示例数据
#分组名称
Category = c("sampleA", "sampleB", "sampleC", "sampleD", "sampleE")
#样本数据(样本数据为矩阵,绘制堆叠柱状图)
Value = matrix(sample(20:80,15),nrow=3)
查看一下:
简单的画一个堆叠柱状图:
barplot(data$Value,names.arg = data$Category,xlab = "value",ylab = "name",main="bar")
现在的柱状图只有黑白灰三种颜色,可以通过col参数定义不同分组的颜色,并通过图例进行说明:
barplot(Value,names.arg = Category,xlab = "sample",ylab = "value",main="bar",
col=c("lightgreen","lightblue","orange"))
#绘制图例
legend("topright",legend = c("Group 1", "Group 2" , "Group 3"),
fill = c("lightgreen","lightblue","orange"),cex=0.5)
但是现在不是很美观,我们可以调节一下柱子的间距和图例的位置,不让他遮挡图形:
#space调节柱子间距
barplot(Value,names.arg = Category,xlab = "sample",ylab = "value",main="bar",
col=c("lightgreen","lightblue","orange"),space=1)
#top指定图例位置
legend("top",legend = c("Group 1", "Group 2" , "Group 3"),fill = c("lightgreen","lightblue","orange"),cex=0.5)
使用barplot()函数绘制精美堆叠图
#读入数据,处理数据,把数据整理成barplot要求的输入数据matrix
require("RColorBrewer")
#读取数据
x<-read.table("new_tax_abundance.txt",sep="\t",header = TRUE,check.names=FALSE,comment.char="")
#获得颜色,多个色板组合成一个33个颜色的向量
mycol<-c(brewer.pal(9, "Set1"),brewer.pal(12, "Paired"),brewer.pal(12, "Set3"))
#按第二列拍一下序,
x<-x[order(x[,2],decreasing =T),]
#删除第一列结果保存到a中
a<-x[,2:ncol(x)]
#修改a变量中的行名
rownames(a)<-x[,1]
#将a变量数据框转换成矩阵,因为barplot只能输入矩阵数据
t<-as.matrix(a)
########################################
#绘图开始,简单barplot的绘图不能达到我们要的结果,legend和坐标轴需要调整。
##########################################
dev.off()
barplot(t,col=mycol[1:nrow(t)],ylab="Relative abundance ")
legend("topright",rownames(t),fill=mycol[1:nrow(t)])
####################################
#修改参数,调整图片,美化图片
######################################
dev.off() #关闭绘图设备,初始化par
par(mar=c(18, 5, 4, 1.1))
p<-barplot(t,main="abundance",xaxs="i",
ylim=c(0,1),axisnames=F,border = NA ,
space=0,col=mycol[1:nrow(t)],ylab="Relative abundance ")
#axis函数用于绘制坐标轴
axis(side=1,p,labels=F)
#text函数用于在图中添加文字
text(x=p-0.25, y=-0.04, labels=colnames(t),cex=1, xpd=TRUE, srt=45,adj=1)
box(bty="l")
legend("bottom",ncol=3,xpd=T,bty = "n",
legend=rownames(t),fill=mycol[1:nrow(t)], border = NA,
inset=c(0,-0.85),cex=1)
#OTU ID 2my101 2my102 2my201 2my202 2my301 2my302 2w101 2w102
0319-7L14 0 5.55E-05 6.40E-05 5.86E-05 0 9.79E-05 0.000112328 0
Acidimicrobiia 0.045025218 0.038095767 0.043830477 0.036355467 0.056052325 0.056198468 0.023195732 0.028347517
Acidobacteriia 0.010197157 0.009695086 0.010914983 0.014143664 0.00958218 0.011034179 0.023139568 0.020326945
Actinobacteria 0.003979826 0.002904825 0.003986527 0.002344254 0.004482356 0.002642331 0.01067116 0.006796057
Alphaproteobacteria 0.102063274 0.111882031 0.11876439 0.110199457 0.181169529 0.108800431 0.160853693 0.148411192
Anaerolineae 0.04350298 0.027475577 0.034322504 0.027447303 0.026688316 0.035157684 0.030103903 0.033306802
Bacteroidia 0.003888125 0.014413114 0.010403343 0.013889703 0.027900382 0.009615149 0.007469812 0.004714382
Blastocatellia_(Subgroup_4) 0.128069693 0.113325192 0.144772747 0.1216863 0.07919592 0.112617131 0.147486661 0.135186432
Chloroflexia 0.002200825 0.001313647 0.002622154 0.000586063 0.002904384 0.002006214 0.0042123 0.002571481
Dehalococcoidia 0.008821641 0.011730314 0.009827748 0.010568677 0.008072815 0.013529714 0.004942432 0.005755219
Deltaproteobacteria 0.076148556 0.096599319 0.081308092 0.105393737 0.067464038 0.089252073 0.075877562 0.070593277
Gammaproteobacteria 0.090215497 0.103204559 0.108062591 0.110004102 0.128661925 0.088126636 0.11305813 0.094899896
Gemmatimonadetes 0.059000459 0.063277087 0.051718257 0.053429448 0.051775791 0.055024099 0.030721707 0.036000735
Gitt-GS-136 0.03565337 0.033562759 0.037371024 0.037488523 0.03069042 0.038778656 0.018927268 0.029143452
Holophagae 0.012948189 0.021462404 0.01272704 0.020746645 0.015985547 0.014312627 0.020387532 0.02026572
JG30-KF-CM66 0.008051353 0.006956779 0.00763196 0.006661587 0.010382601 0.009174761 0.003032856 0.00287761
KD4-96 0.064667584 0.042573268 0.047561184 0.040790013 0.042536648 0.061311868 0.065711879 0.082899651
MB-A2-108 0.015479138 0.012026347 0.011277394 0.013792026 0.005785899 0.019059037 0.01853412 0.024612747
NC10 0.06954608 0.051417259 0.054319093 0.05788353 0.022297436 0.052381768 0.059084527 0.069246311
参考资料:
视频课程:https://bdtcd.xetslk.com/s/2G8tHr