5.2 柱状图的制作
##请注意,我在2009年4月9日发现了全新的作图方法,不要再浪费时间看着一部分了,请到
http://cos.name/bbs/read.php?tid=14828看最简单的,最终极的方法!
R中的柱状图只能针对矩阵(matrix)对象才能进行,这点我很讨厌,很多时候都会忍不住把数据倒入excel,然后用sigmaplot去做。不过如果数据量非常大,也就值得花点时间在R中作一下。首先将前面的数据转换成矩阵格式,注意matrix(data)方程中的data需要是向量(vector)格式。这里把均值和误差值分别转换成矩阵。
matwt<-matrix(data=c(group$Meanwt),nrow=3,ncol=2,
dimnames=list(c("D16","D20","D22"),c("CV39","CV52")),byrow=FALSE)
matwtse<-matrix(data=c(group$SEwt),nrow=3,ncol=2,
dimnames=list(c("D16","D20","D22"),c("CV39","CV52")),byrow=FALSE)
matvc<-matrix(data=c(group$Meanvc),nrow=3,ncol=2,
dimnames=list(c("D16","D20","D22"),c("CV39","CV52")),byrow=FALSE)
matvcse<-matrix(data=c(group$SEvc),nrow=3,ncol=2,
dimnames=list(c("D16","D20","D22"),c("CV39","CV52")),byrow=FALSE)
数据准备好之后终于可以做柱状图了,这里运用gplots这个包里面的barplot2()这个方程,因为这个方程可以直接把误差添加上,而R默认的barplot方程不具备这种功能。下面对多图组合也进行简要介绍。
#为了将多个图进行组合,往往需要在一张纸上画几个图,这些图很多时候可能共用一个x轴或者一个y轴(见图2)。对此R中有一个par()方程进行设定。这个方程中有很多参数,本文中将要重复应用的参数包括mfcol=c(a,b), 定义组合图中有a行b列共a*b个图; mai=c(a,b,c,d)和 omi=c(a,b,c,d)分别定义图的边(margin)和图的外边空间大小。这个空间所对应的图上的区域是以后图形组合的关键,强烈建议参考《R Graphics》一书第三章的解释。
library(gplots) #加载需要的包
par(mfcol=c(2,2),mai=c(0,0,0,0),omi=c(0.6,0.6,0.1,0.1))
#定义柱状图中的误差
ci.l<-matwt-matwtse
ci.u<-matwt+matwtse
#对重量做柱状图,详细的参数涵义参考: ?barplot2(),请特别注意xaxt的应用,它非常有用。
barplot2(matwt,beside=TRUE,col=c("black","gray","white"),legend=rownames(matwtse),plot.ci=TRUE,ci.l=ci.l,ci.u=ci.u,ylim=c(0,5.5),xaxt="n")
box()
#添加显著性差异的字母组合
text(x=c(1.5,2.5,3.5,5.5,6.5,7.5),y=c((group$Meanwt+group$SEwt)*1.1),group$Groupwt)
#添加小图的标志
legend("topleft","A",bty="n")
#对vc含量进行作图
ci.l<-matvc-matvcse
ci.u<-matvc+matvcse
barplot2(matvc,beside=TRUE,col=c("black","gray","white"),plot.ci=TRUE,ci.l=ci.l,ci.u=ci.u,ylim=c(0,79))
box()
text(x=c(1.5,2.5,3.5,5.5,6.5,7.5),y=c((group$Meanvc+group$SEvc)+3),group$Groupvc)
legend("topleft","C",bty="n")
#从图2可以看出,上面的这个柱状图的组合方法主要突出的是播种日期对重量和vc含量的影响。如果想强调品种之间的不同,可以通过对数据的重新组合画另外一种柱状图。
#转置(transpose)前面的矩阵
tmatwt<-t(matwt)
tmatvc<-t(matvc)
#做新的柱状图
barplot2(tmatwt,beside=TRUE,ylim=c(0,5.5),col=c("black","gray"),legend=rownames(tmatwt),xaxt="n",yaxt="n")
box()
legend("topleft","B",bty="n")
barplot2(tmatvc,beside=TRUE,ylim=c(0,79),col=c("black","gray"),yaxt="n")
box()
legend("topleft","D",bty="n")
#添加x轴和y轴的标题。
mtext("品种",side=1,adj=0.5,outer=TRUE,line=2,at=0.25)
mtext("播种日期",side=1,adj=0.5,outer=TRUE,line=2,at=0.75)
mtext("重量(kg)",side=2,at=0.75,adj=0.5,outer=TRUE,line=2)
mtext("维他命含量(mg/kg)",side=2,at=0.25,adj=0.5,outer=TRUE,line=2)