如何向ggplot2箱线图添加水平线?

机器算法验证 r 箱形图 ggplot2
2022-03-18 04:52:44

我使用 ggplot2 在 R 中有一个箱线图输出:

p <- ggplot(data, aes(y = age, x = group))
p <- p + geom_boxplot()
p <- p + scale_x_discrete(name= "Group",)
p <- p + scale_y_continuous(name= "Age")
p

ggplot2 箱线图

我需要在常见的箱线图上添加水平线(并尽可能更改垂直线样式):

boxplot(age~group,data=data,names=c('1','2'),ylab="Age", xlab="Group")

常见箱线图

我怎么能用ggplot2做到这一点?

3个回答

自己找到了解决方案。也许有人可以使用它:

#step 1: preparing data
ageMetaData <- ddply(data,~group,summarise,
            mean=mean(age),
            sd=sd(age),
            min=min(age),
            max=max(age),
            median=median(age),
            Q1=summary(age)['1st Qu.'],
            Q3=summary(age)['3rd Qu.']
            )
#step 2: correction for outliers
out <- data.frame() #initialising storage for outliers
for(group in 1:length((levels(factor(data$group))))){
	bps <- boxplot.stats(data$age[data$group == group],coef=1.5) 
	ageMetaData[ageMetaData$group == group,]$min <- bps$stats[1] #lower wisker
	ageMetaData[ageMetaData$group == group,]$max <- bps$stats[5] #upper wisker
	if(length(bps$out) > 0){ #adding outliers
		for(y in 1:length(bps$out)){
			pt <-data.frame(x=group,y=bps$out[y]) 
            out<-rbind(out,pt) 
        }
    }
}
#step 3: drawing
p <- ggplot(ageMetaData, aes(x = group,y=mean)) 
p <- p + geom_errorbar(aes(ymin=min,ymax=max),linetype = 1,width = 0.5) #main range
p <- p + geom_crossbar(aes(y=median,ymin=Q1,ymax=Q3),linetype = 1,fill='white') #box
# drawning outliers if any
if(length(out) >0) p <- p + geom_point(data=out,aes(x=x,y=y),shape=4) 
p <- p + scale_x_discrete(name= "Group")
p <- p + scale_y_continuous(name= "Age")
p

分位数数据结果很难看,但有效。也许还有另一种方式。结果如下所示:

带有限制线的ggplot2箱线图

还稍微改进了箱线图:

  1. 添加了第二个较小的虚线误差条以反映 sd 范围。
  2. 添加点以反映均值
  3. 移除背景

也许这对某人也可能有用:

p <- ggplot(ageMetaData, aes(x = group,y=mean)) 
p <- p + geom_errorbar(aes(ymin=min,ymax=max),linetype = 1,width = 0.5) #main range
p <- p + geom_crossbar(aes(y=median,ymin=Q1,ymax=Q3),linetype = 1,fill='white') #box
p <- p + geom_errorbar(aes(ymin=mean-sd,ymax=mean+sd),linetype = 3,width = 0.25) #sd range
p <- p + geom_point() # mean
# drawning outliers if any
if(length(out) >0) p <- p + geom_point(data=out,aes(x=x,y=y),shape=4) 
p <- p + scale_x_discrete(name= "Group")
p <- p + scale_y_continuous(name= "Age")
p + opts(panel.background = theme_rect(fill = "white",colour = NA))

结果是:

带有ggplot2的高级箱线图

以及具有较小范围的相同数据(箱线图coef = 0.5

带有异常值的箱线图

有一个更简单的解决方案使用stat_boxplot(geom ='errorbar')

我举个例子:

bp <- ggplot(iris, aes(factor(Species), Sepal.Width, fill = Species))
bp + geom_boxplot() + stat_boxplot(geom ='errorbar') 

结果:

在此处输入图像描述

我认为如果 stat_boxplot(geom ='errorbar') 在第一行看起来会更好,因为它隐藏了垂直线。

    bp <- ggplot(iris, aes(factor(Species), Sepal.Width, fill = Species))+     stat_boxplot(geom ='errorbar')
    bp + geom_boxplot()

在此处输入图像描述