R语言barplot ,掌握本篇的内容,基本的条形图都可以画了
本篇主要想复现文章中的一张图,原图来源(Antibiotic resistome and its association with bacterial communities during sewage sludge composting);
首先来分析一下张图,个人认为至少需要两个图层叠加,
1.堆积条形图和x轴,左y轴,堆积条形图的图例是一个图层;
2.点线图和点线图的图例,右y轴是一个图层;
当然,你还可以拆分,比如图例也是单独图层添加,完全没有问题,但是那样就麻烦了,需要考虑布局,绘图区域大小等问题;
我们没有跟文献中的图一模一样,没有仔细阅读文章,不清楚绘图的数据是否在文章中都提供了,自己造数据吧,最终绘图结果如下:
图的意思呢,每个柱子代表每次模拟考试成绩的分值,用堆积条形图来展示,上方的点线图是代表每次模拟考试数学成绩所占的百分比。
好了,先模拟数据;
mypar <- par(no.readonly = T)# 保存par的默认参数
set.seed(200) #设定随机数
library(RColorBrewer) #加载颜色面板
mycol<- brewer.pal(7,"Set1")#存储颜色
数学 <- round(runif(7,50,100),3)
语文 <- round(runif(7,50,100),3)
英语 <- round(runif(7,10,100),3)
生物 <- round(runif(7,70,100),3)
物理 <- round(runif(7,60,100),3)
地理 <- round(runif(7,80,100),3)
历史 <- round(runif(7,50,100),3)
myframe <- data.frame(数学,语文,英语,生物,物理,地理,历史)
mymatrix <- t(as.matrix(myframe))
mysum <- apply(mymatrix, 2, sum) #每次模拟总成绩
ratio_shuexue <- mymatrix[1,]/mysum #每次模拟数学所占比例
moni <- c("模拟1","模拟2","模拟3","模拟4","模拟5","模拟6","模拟7")
第一个图层:
par(mar=c(5,4,6,5)) #设置绘图区域边界
mybar <- barplot(mymatrix,col=mycol[1:7],space = 0.5,axes = F,names.arg = moni,cex.names = .8,xlim = c(0,11),ylim = c(0,800)) #绘制条形图
par(xpd=T) #确保绘图区域外部能添加元素
legend(1,900,legend = colnames(myframe),fill = mycol[1:7],border = F,ncol = 7,cex=.8,x.intersp = .2,y.intersp = .5,text.font = 1,bty = "n",text.width = .3)#添加图例
axis(side = 2,at = seq(0,800,400),cex.axis=.8,line = -2)#添加左坐标轴
其中par 中mar参数需要个人根据后续要添加的点线图不断尝试(这个在每个人的电脑上展示的图片效果可能不一样,代码可以照搬,但要修改一些布局参数)。
添加第二个图层;
par(new=T) #添加新图层
par(mar=c(3.5,4,6,4)) #设置绘图边界
plot(mybar,ratio_shuexue,type="b",axes=F,ann=F,xlim = c(0,11),ylim = c(0,0.18),col='black',lwd=2,pch=19)#添加点线图
axis(side = 4,at = seq(0,0.18,0.02),cex.axis=.8,line = -3)#添加右坐标轴
legend(0.1,0.15,legend = "数学比例",col="black",bty="n",pch=19,x.intersp = .3,lty=1,lwd=2)#添加图例
mtext("分数",side = 2,font = 2,cex=1)#添加坐标轴标题
mtext("百分比",side = 4,font = 2,cex=1)
par(mypar)#恢复默认绘图参数
运行完这部分代码就能得到一开始的那张图了,par参数在rstudio里面设置一次就会一直生效,除非关闭再打开,所以代码最后设置par(mypar),使其恢复到最开始的状态。
好了,本次就到这里。