本篇介绍如何利用R软件和ggplot2制作误差线的条形图,我们可以使用如下几个函数制作不同类型的误差线图形:
- geom_errorbar()
- geme_linerange()
- geom_pointrange()
- geom_crossbar()
- geom_errorbarh()
条形图和线图上增加误差线
准备数据
library(ggplot2) df <- ToothGrowth df$dose <- as.factor(df$dose) head(df) ## len supp dose ## 1 4.2 VC 0.5 ## 2 11.5 VC 0.5 ## 3 7.3 VC 0.5 ## 4 5.8 VC 0.5 ## 5 6.4 VC 0.5 ## 6 10.0 VC 0.5
- len : Tooth length
- dose : Dose in milligrams (0.5, 1, 2)
- supp : Supplement type (VC or OJ)
在下面的例子中,我们将绘制每组Tooth长度的平均值。标准差用于在图表上绘制误差线。首先,下面写个函数将用于计算每组中感兴趣变量的均值和标准差:
data_summary <- function(data, varname, groupnames){ require(plyr) summary_func <- function(x, col){ c(mean = mean(x[[col]], na.rm=TRUE), sd = sd(x[[col]], na.rm=TRUE)) } data_sum<-ddply(data, groupnames, .fun=summary_func, varname) data_sum <- rename(data_sum, c("mean" = varname)) return(data_sum) }
Ok,我们运用到我们数据里
df2 <- data_summary(ToothGrowth, varname="len", groupnames=c("supp", "dose")) # Convert dose to a factor variable df2$dose=as.factor(df2$dose) head(df2) ## supp dose len sd ## 1 OJ 0.5 13.23 4.459709 ## 2 OJ 1 22.70 3.910953 ## 3 OJ 2 26.06 2.655058 ## 4 VC 0.5 7.98 2.746634 ## 5 VC 1 16.77 2.515309 ## 6 VC 2 26.14 4.797731
带误差线的条形图
使用geom_errorbar()函数
library(ggplot2) # Default bar plot p<- ggplot(df2, aes(x=dose, y=len, fill=supp)) + geom_bar(stat="identity", color="black", position=position_dodge()) + geom_errorbar(aes(ymin=len-sd, ymax=len+sd), width=.2, position=position_dodge(.9)) print(p) # Finished bar plot p+labs(title="Tooth length per dose", x="Dose (mg)", y = "Length")+ theme_classic() + scale_fill_manual(values=c('#999999','#E69F00'))
若我们只想保留误差线的上面的部分,只需将geom_errorbar函数中ymin = len - sd改为 ymin = len
带误差线的线图
# Default line plot p<- ggplot(df2, aes(x=dose, y=len, group=supp, color=supp)) + geom_line() + geom_point()+ geom_errorbar(aes(ymin=len-sd, ymax=len+sd), width=.2, position=position_dodge(0.05)) print(p) # Finished line plot p+labs(title="Tooth length per dose", x="Dose (mg)", y = "Length")+ theme_classic() + scale_color_manual(values=c('#999999','#E69F00'))
我们也可以使用函数geom_pointrange()或者geom_linerange()代替geom_errorbar()函数
# Use geom_pointrange ggplot(df2, aes(x=dose, y=len, group=supp, color=supp)) + geom_pointrange(aes(ymin=len-sd, ymax=len+sd)) # Use geom_line()+geom_pointrange() ggplot(df2, aes(x=dose, y=len, group=supp, color=supp)) + geom_line()+ geom_pointrange(aes(ymin=len-sd, ymax=len+sd))
带有均值和误差线的点图
除了条形图,我们也可以换用另一种形式来表示。我们可以使用geom_dotplot()和stat_summary()函数。点图代替条形图代表数据范围再加上误差线是同样的效果:
p <- ggplot(df, aes(x=dose, y=len)) + geom_dotplot(binaxis='y', stackdir='center') # use geom_crossbar() p + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5) # Use geom_errorbar() p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), geom="errorbar", color="red", width=0.2) + stat_summary(fun.y=mean, geom="point", color="red") # Use geom_pointrange() p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), geom="pointrange", color="red")
Base plot绘制误差线条形图
除了使用ggplot2函数绘制,我们也可以使用最基础的图形语法绘制,这里给个示例,可以了解学习一下:
创建数据集
#创建示范数据集 data <- data.frame( specie=c(rep("sorgho" , 10) , rep("poacee" , 10) ), cond_A=rnorm(20,10,4), cond_B=rnorm(20,8,3), cond_C=rnorm(20,5,4)) #求均值 bilan <- aggregate(cbind(cond_A,cond_B,cond_C)~specie , data=data , mean) rownames(bilan) <- bilan[,1] bilan <- as.matrix(bilan[,-1]) #Plot boundaries lim <- 1.2*max(bilan) #求方差 stdev <- aggregate(cbind(cond_A,cond_B,cond_C)~specie , data=data , sd) rownames(stdev) <- stdev[,1] stdev <- as.matrix(stdev[,-1]) * 1.96 / 10 #设置下方差的范围,防止过度分散 #构造函数创建errobar error.bar <- function(x, y, upper, lower=upper, length=0.1,...){ arrows(x,y+upper, x, y-lower, angle=90, code=3, length=length, ...) }
出图
ze_barplot <- barplot(bilan , beside=T , legend.text=T,col=c("blue" , "skyblue") , ylim=c(0,lim) , ylab="height") error.bar(ze_barplot,bilan, stdev)