R語言barplot ,掌握本篇的內容,基本的條形圖都可以畫了

生信窗發表於2021-03-01

本篇主要想復現文章中的一張圖,原圖來源(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),使其恢復到最開始的狀態。

好了,本次就到這裡。

 

相關文章