此篇主要介紹一下R語言繪製各式的條形圖;需要對R語言有一定的了解,只要有興趣,學習很簡單。
R語言繪圖系統:
R語言實際上由兩大繪圖系統,基礎繪圖系統以及grid繪圖系統,現在介紹的都是基於基礎繪圖系統進行作圖,基於grid繪圖系統的lattice包以及ggplot2包以後會介紹(有興趣可以去網上先找找看,教程有很多)。
條形圖適用:
第一,針對離散數據:
比如小明的數學,語文,英語,成績分別為80,90,70,那麼用條形圖可以完美展示,一行代碼,非常簡單;
barplot(c(80,90,70),names.arg = c("數學","語文","英語")現在小紅的成績也出來了,成績分別為88,95,60;代碼也很簡單,只是添加了顏色和圖例;
library(RColorBrewer) #顏色面板mycol<- brewer.pal(7,"Set3")#barplot(rbind(c(80,90,70),c(88,95,60)),beside = T,names.arg = c("數學","語文","英語"),col=c(mycol[3],mycol[4]))#添加顏色par(xpd=T)legend(8,100,legend = c("xiaoming","xiaohong"),cex=.6,fill =c(col=c(mycol[3],mycol[4])),pt.cex = .5,bty="n")#添加圖例
如果想要展示每個柱子的數值呢,仔細觀察,barplot是沒有x軸信息的,玄機就在barplot函數的返回值裡面,用mypos接受barplot返回值,mypos包含的數值就是每個柱子的中間部位對應的橫坐標值,然後利用text添加就很簡單了;
library(RColorBrewer) #顏色面板mycol<- brewer.pal(7,"Set3")#mypos <- barplot(rbind(xiaoming,xiaohong),beside = T,names.arg = c("數學","語文","英語"),col=c(mycol[3],mycol[4]))#添加顏色par(xpd=T)legend(8,100,legend = c("xiaoming","xiaohong"),cex=.6,fill =c(col=c(mycol[3],mycol[4])),pt.cex = .5,bty="n")#添加圖例text(t(mypos),c(xiaoming,xiaohong)+5,c(xiaoming,xiaohong))#添加數值
也可以橫著放,疊著放。。。
barplot(rbind(c(80,90,70),c(88,95,60)),beside = T,names.arg = c("數學","語文","英語"),col=c(mycol[3],mycol[4]),horiz =T)#橫著放barplot(rbind(c(80,90,70),c(88,95,60)),names.arg = c("數學","語文","英語"),col=c(mycol[3],mycol[4]))#疊著放
然後畫出我們封面圖的代碼就很簡單了,添加點,添加線就好了;
set.seed(100)mycolor <- brewer.pal(7, "Set3") myvalue <- runif(7,10,50)xpos <- barplot(myvalue,col=mycolor,names.arg = letters[1:7],ylim=c(0,45))points(xpos,myvalue+2,pch=3,col=mycolor)points(xpos,myvalue+2,pch=19,col=mycolor)lines(xpos,myvalue,lwd=2,lty=2)
第二,針對論文中常見的均值加減標準誤:
a. 均值加減標準誤表示多次抽樣的均值的離散程度,主要表示抽樣誤差;
b. 均值加減標準差表示一次抽樣,數據的離散程度;
c. 還有人用均值加減2倍或3倍標準誤,都可以;
幾種方式在論文中都有人在用,此處我們用標準誤作為誤差棒繪製的數據;
例如小明第一次模擬試各門成績為88,89,99,90;第二次模擬考試各門成績為90,79,60,93;用條形圖來展示兩次數據:
標準誤計算為: 標準差/sqrt(n)
chengji_1 <- c(88,89,99,90)chengji_2 <- c(90,79,60,93)se_1 <- sd(chengji_1)/sqrt(4) #計算標準誤se_2 <- sd(chengji_2)/sqrt(4)mean_1 <- mean(chengji_1) #計算均值mean_2 <- mean(chengji_2)有了前面的條形圖基礎,此處就很簡單了,誤差棒繪製用R中的arrows就可以了;
mypos <- barplot(main="成績",c(mean_1,mean_2),col=c(mycol[1],mycol[2]),names.arg = c("模擬1","模擬2"))arrows(x0 = mypos,y0 = c(mean_1-se_1,mean_2-se_2),x1 = mypos,y1 = c(mean_1+se_1,mean_2+se_2),code=3,angle = 90,length = 0.07)
缺點:條形圖的缺點是不能反應數據分布,比如一個柱子只能反應一個數據,或者一組數據的平均數,反應數據分布的話箱線圖是個很好的選擇,後面再說。
最後放個進階版條形圖,圖片看著簡單,邏輯還是比較複雜的:
y <- sample(1:10)midpts <- barplot(y,col="light gray") width <- diff(midpts[1:2])/4left <- rep(midpts,y-1)-widthright <- rep(midpts,y-1)+width height <- unlist(apply(matrix(y,ncol = 10),2,seq))[-cumsum(y)] segments(left,height,right,height,col="red")參考:
R Graphics (2nd Edition)