ggplot2:带有抖动点和晶须的箱形图,但没有错误条穿过箱形图的IQR

时间:2018-12-07 10:28:12

标签: r ggplot2

我有以下可重现的代码,为我提供了一个带抖动点的箱形图(标称x轴带有另一个分组因子):

ggplot(mtcars,aes(as.factor(cyl),disp))+
 geom_jitter(aes(color=as.factor(am)),position=position_jitterdodge(dodge.width=0.88),cex=.8)+
 geom_boxplot(aes(fill=as.factor(am)),width=1,outlier.shape=NA,position=position_dodge(width=.88))+
 scale_fill_manual(values=c(NA,NA))

Boxplot Example

我想在箱形图中添加晶须,但是我知道的唯一方法是使用stat_boxplot,它会在箱形图中的IQR范围内放置一条误差线,并且看起来没有吸引力:

ggplot(mtcars,aes(as.factor(cyl),disp))+
  geom_jitter(aes(color=as.factor(am)),position=position_jitterdodge(dodge.width=0.88),cex=.8)+
  stat_boxplot(geom ='errorbar',position=position_dodge(width=.88),aes(fill=as.factor(am))) + 
  geom_boxplot(aes(fill=as.factor(am)),width=1,outlier.shape=NA,position=position_dodge(width=.88))+
  scale_fill_manual(values=c(NA,NA))

Second example

我试图通过编写自己的上下晶须代码,然后使用statsummary仅放置所需的晶须行来解决此问题,如下所示:

upper_whisker<-function(x) {
  work<-quantile(x,na.rm=T,names=F)
  obs<-max(x[x<=work[4]],na.rm=T)
  whisker<-obs+1.5*IQR(x,na.rm=T)
  return(whisker)
}

lower_whisker<-function(x) {
  work<-quantile(x,na.rm=T,names=F)
  obs<-min(x[x>=work[2]],na.rm=T)
  whisker<-obs-1.5*IQR(x,na.rm=T)
  return(whisker)
}
ggplot(mtcars,aes(as.factor(cyl),disp))+
  geom_jitter(aes(color=as.factor(am)),position=position_jitterdodge(dodge.width=0.88),cex=.8)+
  #stat_boxplot(geom ='errorbar',position=position_dodge(width=.88),aes(fill=as.factor(am))) + 
  stat_summary(aes(group=as.factor(am)),fun.y=upper_whisker,fun.ymin=upper_whisker,fun.ymax=upper_whisker,geom="errorbar",color="black",width=0.5,size=0.4,position=position_dodge(width=0.88))+
  stat_summary(aes(group=as.factor(am)),fun.y=lower_whisker,fun.ymin=lower_whisker,fun.ymax=lower_whisker,geom="errorbar",color="black",width=0.5,size=0.4,position=position_dodge(width=0.88))+
  geom_boxplot(aes(fill=as.factor(am)),width=1,outlier.shape=NA,position=position_dodge(width=.88))+
  scale_fill_manual(values=c(NA,NA))

Final Example

但是您可以看到晶须不在正确的位置,所以我必须对公式做错了(我在这里找到了公式:https://www.r-bloggers.com/whisker-of-boxplot/

如果有人可以告诉我如何正确地使用公式,或者如果他们对如何按照我需要的方式制作晶须有更好的想法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

在这一行:obs<-min(x[x>=work[2]],na.rm=T)中,取x的最小值,其中x高于1Q(即1Q)。这不是您想要的。

通过以下方式替换晶须功能

编辑2009年12月18日-使用R boxplot获取坐标

upper_whisker<-function(x) {
  box_stats <- boxplot(x)$stats[5]
  return(box_stats)
}

lower_whisker<-function(x) {
  box_stats <- boxplot(x)$stats[1]
  return(box_stats)
}