在上一篇的推文中,我仿照文獻中的圖繪製了一個利用條形圖和「點+垂線」組成展示樣品中抗生素抗性基因和可移動基因單元檢出數目的繪圖方法,今天繼續仿照文獻中的圖繪製條形圖與點線圖結合,同時展示樣品中目的基因絕對豐度和相對豐度的圖形繪製方法。
本文會詳細介紹繪圖過程中如何進行條形圖的繪製並通過修改參數對圖像進行調整,本文旨在通過繪圖實例講解各個參數的使用方法,希望大家能夠活學活用。
特別要注意的是,本文內容中涉及的具體參數數值是根據繪圖數據和生成圖像的大小設置的,在自己繪製圖像時需要根據自己的數據進行調整,切勿直接套用。
例圖展示原本文章中的圖如下所示,使用堆疊的條形展示不同類型抗生素抗性基因的相對豐度,使用單獨的條形展示可移動基因單元的相對豐度,之後使用點線圖展示了抗生素抗性基因的總豐度。
我在繪圖的過程中,對圖像進行了輕微的改動,添加了不同組樣本間的間隔以更好的區分樣品的分組信息,最終的圖像就是下方這樣。
先給出繪圖的完整代碼:
args.mges.number <- read.table("ARGs.MGEs.abundance.txt",header = TRUE,sep = "\t",row.names = 1)args.16s.abundance <- read.table("ARGs.16S.abundance.txt",header = TRUE,sep = "\t",row.names = 1)args.mges.number <- as.matrix(args.mges.number)args.16s.abundance <- as.matrix(args.16s.abundance)
library(RColorBrewer)
tiff(filename = "ARGs.MGEs.abundance.time.tiff",width = 12000,height = 9000,res = 600,compression = "lzw")par(mar=c(6.3,8,4,10))
bar1 <- barplot(args.mges.number[1:8,],names.arg = c(rep("",27)),space = 0.1,col = brewer.pal(8,"Set3"),border = "black",xlim = c(0,29),axes = F,ylim = c(0,0.015))
axis(side = 2,at = seq(0,0.015,0.003),las = 2,line = -1.55,cex.axis = 2.2,lwd = 3,lwd.ticks = 3,font = 2)
bar2 <- barplot(args.mges.number[9,],names.arg = c(rep("",27)),space = 0.1,col = "yellow",border = "black",xlim = c(0,29),axes = F,ylim = c(0,0.015),add = TRUE)par(xpd = TRUE)par(new = T)par(mar = c(4,8,4,10))
plot(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),y = args.16s.abundance[1,],type = "b",col = "red",axes = F,xlim = c(0,29),xlab = "",ylab = "",ylim = c(0,12),pch = 19,bg = "red",cex = 4,lwd = 5)
par(xpd = TRUE)par(new = T)par(mar = c(4,8,4,10))plot(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),y = args.16s.abundance[2,],type = "b",col = "black",axes = F,xlim = c(0,29),xlab = "",ylab = "",ylim = c(0,12),pch = 19,bg = "black",cex = 4,lwd = 5)
axis(side = 1, at = c(-0.2,1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65,30),line = -1,labels = FALSE,cex.axis = 2.2,lwd = 3,lwd.ticks = 3,font = 2)text(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65), y = -0.42,adj = c(1,0.8),labels = colnames(args.16s.abundance),cex = 2.4, font = 2,srt = 45)
axis(side = 4,at = c(0,3,6,9,12),line = 1,las = 2,cex.axis = 3,lwd = 3,lwd.ticks = 3,font = 2)mtext("Normalized copy number (copies per 16S rRNA gene)",side = 2,line = 5.2,font = 2,cex = 3)mtext("Abundance (copies per g dry sediment)",side = 4,line = 6,font = 2,cex = 3)
par(xpd=TRUE)par(new = T)plot(0:1, 0:1, type="n", xlab="",ylab="", axes=FALSE)legend(-0.02,1.1,legend = rownames(args.mges.number[1:8,]),fill = brewer.pal(8,"Set3"),bty = "n",ncol = 4,text.width = 0.21,cex = 2.5,text.font = 2)legend(0.01,0.55,legend = c("Total ARGs","16S rRNA gene"),pch = 19,col = c("red","black"),bty = "n",cex = 2.5,pt.cex = 3.3,text.font = 2,text.width = 0.2,x.intersp = 1.35,lty = 1,lwd = 5)legend(-0.02,1.015,legend = "MGEs",fill = "yellow",bty = "n",cex = 2.5,text.font = 2)dev.off()圖像的繪製需要兩個數據文件,一個用於繪製條形圖,另一個用於繪製點線圖。
點線圖的繪製文件就是普通的數據表格式。
條形圖的繪製文件比較特殊,每一個樣品的數據佔兩列,分別代表兩個相鄰條形的繪製數據,並且在不同組樣品間需要間隔一個無數據的空列。
繪圖過程詳解
首先載入繪圖數據和繪圖所需要的包。
args.mges.number <- read.table("ARGs.MGEs.abundance.txt",header = TRUE,sep = "\t",row.names = 1)args.16s.abundance <- read.table("ARGs.16S.abundance.txt",header = TRUE,sep = "\t",row.names = 1)args.mges.number <- as.matrix(args.mges.number)args.16s.abundance <- as.matrix(args.16s.abundance)library(RColorBrewer)堆疊條形圖的繪製首先繪製第一個堆疊的條形圖。
#定義圖像輸出路徑和大小tiff(filename = "ARGs.MGEs.abundance.time.tiff",width = 12000,height = 9000,res = 600,compression = "lzw")#定義繪圖區par(mar=c(6.3,8,4,10))#繪製條形圖bar1 <- barplot(args.mges.number[1:8,],names.arg = c(rep("",27)),space = 0.1,col = brewer.pal(8,"Set3"),border = "black",xlim = c(0,29),axes = F,ylim = c(0,0.015))#添加坐標軸axis(side = 2,at = seq(0,0.015,0.003),las = 2,line = -1.55,cex.axis = 2.2,lwd = 3,lwd.ticks = 3,font = 2)這裡繪圖邊界的大小要根據實際需要進行調整,主要是要滿足後續點線圖與條形圖的匹配,以及為坐標軸和圖例留出足夠的空間。
條形圖只使用[1:8,]選擇前8行進行繪圖,第9行是可移動基因單元,用於繪製點線圖。
names.arg將x軸坐標設置為空,axes = F將坐標軸隱藏,這樣才能通過後續的自主添加調整坐標軸及標籤的位置,自帶的坐標軸位置固定並且各項參數不好調整。
注意這裡x軸對應的樣品數目並不是真實的樣品數目,而是數據表中列的總數(每一個樣品對應兩列,外加組間的空列)。
應用space = 0.1設置一個較小的條形間距,以便在添加第二個條形圖時能夠進行有效的區分。
xilm和ylim設置x和y軸的範圍,x軸設置為樣品數目+2,我在繪圖前已經規劃好將圖例放在上方,因而y軸的範圍進行了適當的擴大。
要特別注意y軸的範圍要設置的大一些,以保證在條形上方預留足夠的空間用於點線圖的繪製。
將條形圖賦值為bar1,後續會持續用到。
之後使用axis()函數添加條形圖對應的縱坐標軸。
鄰近條形圖的繪製在第一個條形圖的基礎上,添加與之相鄰的第二個條形圖。
bar2 <- barplot(args.mges.number[9,],names.arg = c(rep("",27)),space = 0.1,col = "yellow",border = "black",xlim = c(0,29),axes = F,ylim = c(0,0.015),add = TRUE應用[]命令選擇第9行的數據用於繪製第二個條形圖,注意比對上文提到的數據格式。
將條形顏色設置為與第一個條形圖不同的顏色,並且將add參數設置為TRUE,這樣才能在第一個圖基礎上添加第二個條形圖。
其餘參數與第一個條形圖一致。
將條形圖賦值為bar2,後續會持續用到。
點線圖添加之後進行點線圖的添加。
#添加第一條點線圖par(xpd = TRUE)par(new = T)par(mar = c(4,8,4,10))plot(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),y = args.16s.abundance[1,],type = "b",col = "red",axes = F,xlim = c(0,29),xlab = "",ylab = "",ylim = c(0,12),pch = 19,bg = "red",cex = 4,lwd = 5)#添加第二條點線圖par(xpd = TRUE)par(new = T)par(mar = c(4,8,4,10))plot(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),y = args.16s.abundance[2,],type = "b",col = "black",axes = F,xlim = c(0,29),xlab = "",ylab = "",ylim = c(0,12),pch = 19,bg = "black",cex = 4,lwd = 5)首先通過par(xpd = TRUE)命令使得接下來繪製的圖像可以在條形圖繪圖邊界部分顯示,防止後續圖像顯示不全。
接下來要新建用於繪製點線圖的繪圖區,繪圖區邊界大小根據出圖效果進行調整。
使用plot()函數先繪製散點圖,散點圖中x軸對應的信息根據bar1和bar2中每個條形所對應的x軸位置進行計算,保證每個點的位置都為與該樣本兩個條形的正中。
根據第二個繪圖數據文件中的行數分別進行點線圖的繪製,每行數據要單獨繪製點線圖。
同樣應用axes = F隱藏坐標軸,將x和y軸標籤設置為空,選擇type = 「b」繪製點線圖,點的形狀選擇19為實心圓形,點和線的顏色根據數據需求自行選擇並記錄,在之後圖例添加過程中進行對應。
其它參數根據圖像的展示情況調整直至滿意。
這裡要特別注意點線圖y軸範圍的確定,要保證所添加的點線圖位於條形圖上方無遮擋。
添加其它坐標軸首先添加橫坐標信息。
axis(side = 1, at = c(-0.2,1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65,30),line = -1,labels = FALSE,cex.axis = 2.2,lwd = 3,lwd.ticks = 3,font = 2)
text(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65), y = -0.42,adj = c(1,0.8),labels = colnames(args.16s.abundance),cex = 2.4, font = 2,srt = 45)side = 1規定坐標軸在下方,labels = FALSE隱藏軸的標籤,line調整軸與圖像的間距。
cex.axis、lwd、lwd.ticks和font的參數與之前繪製的條形圖縱坐標軸保持一致。
之後使用text()函數添加x軸標籤,這樣做是為了能夠方便地對標籤進行調整,例如改變其對其方式、大小、位置、旋轉角度等。
注意x軸標籤位置要與點線圖的x軸坐標位置一致。
接下來添加點線圖對應的縱坐標軸。
axis(side = 4,at = c(0,3,6,9,12),line = 1,las = 2,cex.axis = 3,lwd = 3,lwd.ticks = 3,font = 2)相關參數與第一條縱坐標軸一致,除了應用side = 4將其放置在圖像右側,並且根據會圖數據改變其標籤間隔。
最後使用mtext()命令添加兩個坐標軸對應的labels。
mtext("Normalized copy number (copies per 16S rRNA gene)",side = 2,line = 5.2,font = 2,cex = 3)mtext("Abundance (copies per g dry sediment)",side = 4,line = 6,font = 2,cex = 3)圖例添加首先要新建一個繪圖區,並且建立一個空的圖用來輔助圖例的添加。
par(xpd=TRUE)par(new = T)plot(0:1, 0:1, type="n", xlab="",ylab="", axes=FALSE)之後要分批次的添加圖例,首先添加堆疊條形圖的圖例。
legend(-0.02,1.1,legend = rownames(args.mges.number[1:8,]),fill = brewer.pal(8,"Set3"),bty = "n",ncol = 4,text.width = 0.21,cex = 2.5,text.font = 2)在條形圖的圖例添加時,要注意預留第二個條形圖圖例的位置。
使用ncol調整圖例的列數,text.width調整不同列見圖例的寬度以達到對圖例文字的完整展示。
其它參數根據出圖效果進行調整。
之後添加臨近條形圖的圖例。
legend(-0.02,1.015,legend = "MGEs",fill = "yellow",bty = "n",cex = 2.5,text.font = 2)通過參數的調整,使得該圖例看起來與之前插入的條形圖圖例為同一個圖例。
最後添加點線圖的圖例。
legend(0.01,0.55,legend = c("Total ARGs","16S rRNA gene"),pch = 19,col = c("red","black"),bty = "n",cex = 2.5,pt.cex = 3.3,text.font = 2,text.width = 0.2,x.intersp = 1.35,lty = 1,lwd = 5)dev.off()通過xy坐標調整圖例的位置,cex、pt.cex調整點和文字的大小,x.intersp調整點和文字的間距,調整至自己滿意即可。
擴展閱讀