R中带有误差线的分组条形图

Posted

技术标签:

【中文标题】R中带有误差线的分组条形图【英文标题】:Grouped barplot in R with error bars 【发布时间】:2015-06-28 09:05:25 【问题描述】:

我想绘制带有误差线的分组条形图。这是我到目前为止能够得到的那种数字,这对于我的需要来说是可以的:

这是我的脚本:

#create dataframe
Gene<-c("Gene1","Gene2","Gene1","Gene2")
count1<-c(12,14,16,34)
count2<-c(4,7,9,23)
count3<-c(36,22,54,12)
count4<-c(12,24,35,23)
Species<-c("A","A","B","B")
df<-data.frame(Gene,count1,count2,count3,count4,Species)
df

mean1<-mean(as.numeric(df[1,][c(2,3,4,5)]))
mean2<-mean(as.numeric(df[2,][c(2,3,4,5)]))
mean3<-mean(as.numeric(df[3,][c(2,3,4,5)]))
mean4<-mean(as.numeric(df[4,][c(2,3,4,5)]))
Gene1SpeciesA.stdev<-sd(as.numeric(df[1,][c(2,3,4,5)]))
Gene2SpeciesA.stdev<-sd(as.numeric(df[2,][c(2,3,4,5)]))
Gene1SpeciesB.stdev<-sd(as.numeric(df[3,][c(2,3,4,5)]))
Gene2SpeciesB.stdev<-sd(as.numeric(df[4,][c(2,3,4,5)]))

ToPlot<-c(mean1,mean2,mean3,mean4)

#plot barplot
plot<-matrix(ToPlot,2,2,byrow=TRUE)   #with 2 being replaced by the number of genes!
tplot<-t(plot)
BarPlot <- barplot(tplot, beside=TRUE,ylab="count",
                names.arg=c("Gene1","Gene2"),col=c("blue","red"))

#add legend
legend("topright", 
       legend = c("SpeciesA","SpeciesB"), 
       fill = c("blue","red"))

#add error bars
ee<-matrix(c(Gene1SpeciesA.stdev,Gene2SpeciesA.stdev,Gene1SpeciesB.stdev,Gene2SpeciesB.stdev),2,2,byrow=TRUE)*1.96/sqrt(4)   
tee<-t(ee)
error.bar(BarPlot,tplot,tee)

问题是我需要为 50 个基因和 4 个物种执行此操作,所以我的脚本会变得超长而且我猜这没有优化...我试图寻求帮助 here 但我可以想不出更好的方法来做我想做的事。如果我不需要误差线,我可以适应 this script 但棘手的部分是混合 ggplot 美丽的条形图和误差线! ;)

如果您对优化我的脚本有任何想法,我将不胜感激! :)

非常感谢!

【问题讨论】:

当心t(plot)你完全颠倒了基因;) 【参考方案1】:

从您对df 的定义开始,您只需几行即可:

library(ggplot2)

cols = c(2,3,4,5)
df1  = transform(df, mean=rowMeans(df[cols]), sd=apply(df[cols],1, sd))

# df1 looks like this
#   Gene count1 count2 count3 count4 Species  mean        sd
#1 Gene1     12      4     36     12       A 16.00 13.856406
#2 Gene2     14      7     22     24       A 16.75  7.804913
#3 Gene1     16      9     54     35       B 28.50 20.240224
#4 Gene2     34     23     12     23       B 23.00  8.981462

ggplot(df1, aes(x=as.factor(Gene), y=mean, fill=Species)) +
  geom_bar(position=position_dodge(), stat="identity", colour='black') +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,position=position_dodge(.9))

【讨论】:

谢谢!我现在收到此错误:/ &gt; df1 &lt;- transform(df, mean=rowMeans(df[cols]), sd=apply(df[cols],1, sd)) Error in [.data.frame(df, cols) : object 'cols' not found 对不起,我忘了把 cols 的内容(错误实际上是什么;))现在已编辑! 完美!非常感谢!! :) 不用担心,当你有一个 ggplot 非常合适的 data.frame 时,请记住!

以上是关于R中带有误差线的分组条形图的主要内容,如果未能解决你的问题,请参考以下文章

使用 D3.js 将误差线添加到分组条形图中

R语言使用ggpubr包的ggbarplot函数可视化分组条形图(grouped bar plot)并添加误差条(error bar误差条显示平均值+/-sd)不添加填充色添加jitter抖动

如何在列的分组条形图上添加误差线

如何在 matplotlib 条形图中增加误差线的粗细?

垂直误差线对齐,堆积条形图ggplot

如何在 R 中的 ggplot 中为条形图添加误差线