每天學習一點R:16.barplot條形圖之整合點線圖

2021-12-11 紅皇后學術

收錄於話題 #每天學習一點R 54個內容

在上一篇的推文中,我仿照文獻中的圖繪製了一個利用條形圖和「點+垂線」組成展示樣品中抗生素抗性基因和可移動基因單元檢出數目的繪圖方法,今天繼續仿照文獻中的圖繪製條形圖與點線圖結合,同時展示樣品中目的基因絕對豐度和相對豐度的圖形繪製方法。

本文會詳細介紹繪圖過程中如何進行條形圖的繪製並通過修改參數對圖像進行調整,本文旨在通過繪圖實例講解各個參數的使用方法,希望大家能夠活學活用

特別要注意的是,本文內容中涉及的具體參數數值是根據繪圖數據和生成圖像的大小設置的,在自己繪製圖像時需要根據自己的數據進行調整,切勿直接套用。

例圖展示

原本文章中的圖如下所示,使用堆疊的條形展示不同類型抗生素抗性基因的相對豐度,使用單獨的條形展示可移動基因單元的相對豐度,之後使用點線圖展示了抗生素抗性基因的總豐度。

我在繪圖的過程中,對圖像進行了輕微的改動,添加了不同組樣本間的間隔以更好的區分樣品的分組信息,最終的圖像就是下方這樣。

先給出繪圖的完整代碼

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調整點和文字的間距,調整至自己滿意即可。

擴展閱讀

相關焦點

  • python學習筆記:同時畫多圖,折線圖,箱線圖,條形圖,柱狀圖等
    (figure)figure()#使用subplot創建多個子圖,下面的subplot(2,3,1)表示創建一個包含2行3列圖表的圖紙,1表示第一張圖subplot(2,3,1)plot(x,y)#折線圖subplot(2,3,2)#縱向條形圖
  • R語言中繪製條形圖的函數:barplot
    條形圖(bar chart)是用寬度相同的條形的高度或長短來表示數據多少的圖形。它主要用來展示不同分類(橫軸)下某個數值型變量(縱軸)的取值。在實際中,條形圖主要有簡單條形圖,組合條形圖和堆疊條形圖。在R語言的基礎包中可以使用barplot()函數來繪製條形圖。
  • R語言繪圖(一):barplot()繪製條形圖
    條形圖:表示矩形條中的數據,條的長度與變量的值成比例。R語言中bartplot()函數可用於創建條形圖。
  • R語言學習第4天--barplot()繪製堆砌條形圖
    2、在命令行輸入「example(barplot)」,之後多次點擊「Enter」即可查看多個例圖及對應的腳本。現在我們再輸入barplot(data),就可以出圖了。不過barplot函數默認的圖比較醜,下面我們就要通過添加不同的參數來調節圖形的外觀。
  • R語言基礎繪圖barplot與各種條形圖(1)
    此篇主要介紹一下R語言繪製各式的條形圖;需要對R語言有一定的了解,只要有興趣,學習很簡單。
  • R語言繪製條形圖
    作者:吳健 中國科學院大學 R語言、統計學愛好者,尤其擅長R語言和Arcgis在生態領域的應用分享個人公眾號:統計與程式語言
  • 第13關 吊打Excel的分類圖表-散點圖/箱線圖/琴形圖/點圖/柱狀圖/PairGrid- 小象學院
    ('tips')plt.figure(figsize=(10, 5))# TODO# 繪製條形散點圖,x軸記錄day變量數據,y軸記錄total_bill數據sns.stripplot(x='day',y='total_bill',data=tips)plt.title('每天消費總數條形散點圖')plt.show()
  • R畫circular barplot
    (xid = 1:n()) %>% mutate(angle = 90 - 360 * (xid - 0.5) / n()) %>% mutate(hjust = ifelse(angle < -90, 1, 0)) %>% mutate(angle = ifelse(angle < -90, angle+180, angle))
  • R語言筆記:用barplot()函數繪製酷炫的柱形圖
    (tN, col = rainbow(20))#- type = "h" plotting *is* 'bar'plotlines(r, tN, type = "h", col = "red", lwd = 2)barplot(tN, space = 1.5, axisnames = FALSE, sub = "barplot(..., space= 1.5, axisnames
  • 數據可視化之R語言
    分類數據的可視化使用條形圖、點圖、柱形圖、脊柱圖、馬賽克圖、餅圖及四折圖連續數據的可視化使用箱線圖、直方圖、散點圖及其變種、帕累託圖==============================================一、分類數據的可視化
  • 【R語言】--- graphics包的barplot()函數繪製柱狀圖
    #同一界面顯示多張圖par(mfcol=c(1,2))# 傳入數值型向量vector = c(6, 4, 8) # 繪圖數據(數值型向量)barplot(height = vector)  # 繪製條形圖# 傳入矩陣matrix = matrix(1:4, ncol = 2, nrow = 2)
  • R語言50繪圖|第一期barplot()條形圖
    那今天就和大家分享一下:barplot()條形圖barplot(height, width = 1, space = NULL, names.arg = NULL, legend.text = NULL,beside = FALSE, horiz = FALSE, density
  • 每天學習一點R:46.帶狀圖
    收錄於話題 #每天學習一點 什麼是帶狀圖?
  • 手把手教學,R語言基礎繪圖
    基礎做好了,我們就開始繪圖,繪圖之前,需要對所需繪圖的數據有清晰的認識,根據所想達到的目的去繪圖,常見的作圖類型有條形圖、餅圖、散點圖等,下面我們開始教學模式~條形圖可以展示類別型變量的分布情況,使用的函數為barplot(height),其中height為一個向量或一個矩陣。
  • 使用R繪製幾種常用的雙坐標軸圖形
    如果想把左坐標軸的會員人數用條形圖表示,右坐標軸的總消費額用線條表示,該如何操作呢?很簡單,只需將type參數設置為('bar','line')就可以了:twoord.plot(lx = df1$Date, ly = df1$Consumers, rx = df1$Date, ry = df1$Amount, lcol = 'steelblue', main = '雙軸的兩條線圖', xlab = '月份', ylab = '會員人數', rylab = '總消費額'
  • R語言可視化之UpSetR包
    文中的參數:mb.ratio: 控制上方條形圖以及下方點圖的比例order.by: 如何排序,這裡freq表示從大到小排序展示,其他選項有degree以及先按freq再按degree排序。query: 指定哪個query,UpSetR有內置的,也可以自定義,說到底就是一個查詢函數param: list, query作用於哪個交集color:每個query都是一個list,裡面可以設置顏色,沒設置的話將調用包裡默認的調色板active:被指定的條形圖是否需要顏色覆蓋,TRUE的話顯示顏色,FALSE的話則在條形圖頂端顯示三角形
  • Python數據分析之matplotlib(提高篇)
    條形圖 (bar)fig,axes = plt.subplots(ncols=2,nrows=2)ax1,ax2,ax3,ax4 = axes.ravel()N=5y=[20,10,30,25,15]index = np.arange(N)# bar繪製條形圖ax1.bar(left=index, height=y,width=0.3) #left:橫坐標值 height:縱坐標值 width:條形圖寬度ax2.bar(left=index, height=y,color='red',width=0.3) # color:設置條形圖顏色ax3.bar
  • R語言之ggplot2繪圖
    您可以這樣嵌入一個R代碼塊,本文主要以R語言自帶的數據集為例做介紹:語法/繪圖公式介紹ggplot圖的元素可以主要可以概括如下:最大的是plot(指整張圖,包括background和title),其次是axis(包括stick,text,title和stick)、legend(包括backgroud、text、title)、facet這是第二層次,其中facet可以分為外部strip部分
  • 散點圖、箱線圖、核密度函數……數據分析必備的9種可視化圖表
    如果x軸是一個時間序列,那麼線圖是一個很好的選擇。我們可能會在數據中看到一些時間上的趨勢。在本例中,只能看到數據是按「物種」列排序的(圖中紫色的步驟),並且其他列的移動平均值遵循該模式(花瓣長度,特別是紅色標記的花瓣長度)。散點圖這是一種將兩個連續變量之間的關係可視化的完美圖表。