首頁 > 軟體

R語言繪製帶ErrorBar的分組條形圖程式碼的分享

2022-02-17 13:01:20

筆者近期畫了一張帶error bar的分組條形圖,將相關的程式碼分享一下。

感謝網友青山屋主的建議,提示筆者要嚴謹區分技術重複和生物學重複,所以筆者對文章做修改後重發。如果各位有任何建議,歡迎指正。

本文旨在給出一種利用R對生物學重複資料畫帶error bar的分組條形圖的方法。

所用資料是模擬生成的:分成三個組,每個組進行了若干次生物學重複;測量的是3種基因的表達量。資料的部分內容如下:

##       gene1    gene2    gene3  Group
## 1  49.72475 267.0007 126.2007 Group1
## 2 114.62184 173.8780 150.2641 Group2
## 3 128.03351 227.9456 152.6378 Group3
## 4 134.90841 385.1979 148.2739 Group1
## 5 136.56659 190.0663 122.6201 Group2
## 6 143.88241 329.0516 236.9131 Group3

兩種方法的完整程式碼放在了文末。如有問題,歡迎指正!

第一種實現方法:用aggregate計算資料

# 匯入資料
setwd("E:/")
df <- read.csv("gene_exp.csv", header=T)
 
# 可以在這裡改列名,這些列名就是最終圖上X軸的標籤名。
colnames(df)[1:3] <- c("gene-1", "gene-2", "gene-3")
str(df) # 顯示資料集內容
## 'data.frame':    3000 obs. of  4 variables:
##  $ gene-1: num  49.7 114.6 128 134.9 136.6 ...
##  $ gene-2: num  267 174 228 385 190 ...
##  $ gene-3: num  126 150 153 148 123 ...
##  $ Group : Factor w/ 3 levels "Group1","Group2",..: 1 2 3 1 2 3 1 2 3 1 ...
# 將上述"寬資料"轉化為"長資料"
library(reshape2)
df_reshape <- melt(df, id.vars=c("Group"))
str(df_reshape)
## 'data.frame':    9000 obs. of  3 variables:
##  $ Group   : Factor w/ 3 levels "Group1","Group2",..: 1 2 3 1 2 3 1 2 3 1 ...
##  $ variable: Factor w/ 3 levels "gene-1","gene-2",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ value   : num  49.7 114.6 128 134.9 136.6 ...
# 獲取三個組各個基因表達量的平均值
df_mean <- aggregate(df_reshape$value, list(Group=df_reshape$Group,
                        gene=df_reshape$variable), mean, na.rm=T)
 
# 獲取三個組各個基因表達量的標準差
df_sd <- aggregate(df_reshape$value, list(Group=df_reshape$Group,
                        gene=df_reshape$variable), sd, na.rm=T)
 
# 合併mean和sd
colnames(df_mean)[3] <- "mean"
colnames(df_sd)[3] <- "sd"
df_stat <- merge(df_mean, df_sd, by=c("Group", "gene"))
str(df_stat)
## 'data.frame':    9 obs. of  4 variables:
##  $ Group: Factor w/ 3 levels "Group1","Group2",..: 1 1 1 2 2 2 3 3 3
##  $ gene : Factor w/ 3 levels "gene-1","gene-2",..: 1 2 3 1 2 3 1 2 3
##  $ mean : num  120 249 149 119 250 ...
##  $ sd   : num  19.4 51.4 30.2 21.2 52.3 ...
# 畫圖
#直接在畫圖的語句中計算出error_bar所需的資料:
#(即下面的ymin=mean-sd和ymax=mean+sd語句)。
library(ggplot2)
dodge <- position_dodge(width=.9)
ggplot(data=df_stat) +
  geom_bar(aes(x=gene, y=mean, fill=Group), 
           stat="identity", position=dodge) +
  geom_errorbar(aes(x=gene, ymin=mean-sd, ymax=mean+sd, color=Group), 
                stat="identity", position=dodge, width=.3)

第二種實現方法:用dplyr包計算資料

# 匯入資料
setwd("E:/")
df <- read.csv("gene_exp.csv", header=T)
 
# 可以在這裡改列名,這些列名就是最終圖上X軸的標籤名。
colnames(df)[1:3] <- c("gene-1", "gene-2", "gene-3")
str(df) # 顯示資料集內容
## 'data.frame':    3000 obs. of  4 variables:
##  $ gene-1: num  49.7 114.6 128 134.9 136.6 ...
##  $ gene-2: num  267 174 228 385 190 ...
##  $ gene-3: num  126 150 153 148 123 ...
##  $ Group : Factor w/ 3 levels "Group1","Group2",..: 1 2 3 1 2 3 1 2 3 1 ...
# 獲取三個組各個基因表達量的平均值和標準差
library(tidyr)
library(dplyr)
df_stat <- tbl_df(df) %>%
  gather(gene, value, -Group) %>%  # 將"寬資料"轉化為"長資料"
  group_by(Group, gene) %>%         # 將資料分組
  summarise(mean=mean(value, na.rm=T), sd=sd(value, na.rm=T)) %>% # 計算每組資料的mean和sd
  ungroup()
str(df_stat)
## Classes 'tbl_df', 'tbl' and 'data.frame':    9 obs. of  4 variables:
##  $ Group: Factor w/ 3 levels "Group1","Group2",..: 1 1 1 2 2 2 3 3 3
##  $ gene : chr  "gene-1" "gene-2" "gene-3" "gene-1" ...
##  $ mean : num  120 249 149 119 250 ...
##  $ sd   : num  19.4 51.4 30.2 21.2 52.3 ...
# 畫圖
#直接在畫圖的語句中計算出error_bar所需的資料:
#(即下面的ymin=mean-sd和ymax=mean+sd語句)。
library(ggplot2)
dodge <- position_dodge(width=.9)
df_stat %>% ggplot() +
  geom_bar(aes(x=gene, y=mean, fill=Group), 
           stat="identity", position=dodge) +
  geom_errorbar(aes(x=gene, ymin=mean-sd, ymax=mean+sd, color=Group), 
                stat="identity", position=dodge, width=.3)

兩種方法的結果是一樣的,相對而言,dplyr的實現方法更簡單快捷。

最後,兩種方法的完整程式碼如下:

#################第一種實現方法:用aggregate計算資料######################
# 匯入資料
setwd("E:/")
df <- read.csv("gene_exp.csv", header=T)
 
# 可以在這裡改列名,這些列名就是最終圖上X軸的標籤名。
colnames(df)[1:3] <- c("gene-1", "gene-2", "gene-3")
str(df) # 顯示資料集內容
 
# 將上述"寬資料"轉化為"長資料"
library(reshape2)
df_reshape <- melt(df, id.vars=c("Group"))
str(df_reshape)
 
# 獲取三個組各個基因表達量的平均值
df_mean <- aggregate(df_reshape$value, list(Group=df_reshape$Group,
                        gene=df_reshape$variable), mean, na.rm=T)
 
# 獲取三個組各個基因表達量的標準差
df_sd <- aggregate(df_reshape$value, list(Group=df_reshape$Group,
                        gene=df_reshape$variable), sd, na.rm=T)
 
# 合併mean和sd
colnames(df_mean)[3] <- "mean"
colnames(df_sd)[3] <- "sd"
df_stat <- merge(df_mean, df_sd, by=c("Group", "gene"))
str(df_stat)
 
# 畫圖
#直接在畫圖的語句中計算出error_bar所需的資料:
#(即下面的ymin=mean-sd和ymax=mean+sd語句)。
library(ggplot2)
dodge <- position_dodge(width=.9)
ggplot(data=df_stat) +
  geom_bar(aes(x=gene, y=mean, fill=Group), 
           stat="identity", position=dodge) +
  geom_errorbar(aes(x=gene, ymin=mean-sd, ymax=mean+sd, color=Group), 
                stat="identity", position=dodge, width=.3)
 
####################第二種實現方法:用dplyr包計算資料######################
# 匯入資料
setwd("E:/")
df <- read.csv("gene_exp.csv", header=T)
 
# 可以在這裡改列名,這些列名就是最終圖上X軸的標籤名。
colnames(df)[1:3] <- c("gene-1", "gene-2", "gene-3")
str(df) # 顯示資料集內容
 
# 獲取三個組各個基因表達量的平均值和標準差
library(tidyr)
library(dplyr)
df_stat <- tbl_df(df) %>%
  gather(gene, value, -Group) %>%  # 將"寬資料"轉化為"長資料"
  group_by(Group, gene) %>%         # 將資料分組
  summarise(mean=mean(value, na.rm=T), sd=sd(value, na.rm=T)) %>% # 計算每組資料的mean和sd
  ungroup()
str(df_stat)
 
# 畫圖
#直接在畫圖的語句中計算出error_bar所需的資料:
#(即下面的ymin=mean-sd和ymax=mean+sd語句)。
library(ggplot2)
dodge <- position_dodge(width=.9)
df_stat %>% ggplot() +
  geom_bar(aes(x=gene, y=mean, fill=Group), 
           stat="identity", position=dodge) +
  geom_errorbar(aes(x=gene, ymin=mean-sd, ymax=mean+sd, color=Group), 
                stat="identity", position=dodge, width=.3)

以上就是 R語言繪製帶ErrorBar的分組條形圖程式碼的分享的詳細內容,更多關於 R語言繪製帶ErrorBar的分組條形圖的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com