5

如何使 geom_boxplot 异常值与抖动的 geom_points 完美叠加?

例如,我希望 geom_boxplot 中的异常值在抖动后在 geom_point 的实际点上显示为“十字线”?

library(ggplot2)
p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
  geom_boxplot(outlier.shape=10, outlier.size=8)  +
  geom_point(aes(factor(cyl), mpg, color=mpg),  position="jitter", size=4)
p

阴谋

任何帮助将不胜感激。

4

2 回答 2

5

我同意 Didzis 的观点,即完全符合您的目标的解决方案将得到公平参与。从字面上执行您的建议需要(我认为)您在 ggplot 之外进行抖动和异常值计算。如果您对突出显示异常值的方式很灵活,那么这可能是一个更短的解决方案:

id_outliers <- function(x){
    q <- quantile(x,c(0.25,0.75))
    iqr <- abs(diff(q))
    ifelse((x < q[1] - 1.5*iqr) | (x > q[2] + 1.5*iqr),'Outlier','NotOutlier')
}

mtcars <- ddply(mtcars,
                .(cyl),
                transform,
                out = id_outliers(mpg))

p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
  geom_boxplot(outlier.colour = NA)  + 
  geom_point(aes(colour = mpg,shape = out),position = "jitter")
于 2013-03-28T16:53:15.743 回答
4

这个解决方案会很长。问题是position="jitter"您无法获得点的精确坐标,因此需要找到解决方法。

所以把你原来的情节用ggplot_build(). 数据的第一个元素包含有关箱线图的信息。我们对 column 感兴趣,group因为outliers它显示了 ggplot 假定哪些值是异常值。将它们保存为单独的对象。

p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
                geom_boxplot(outlier.shape=10, outlier.size=8)  +
                geom_point(aes(color=mpg),  position="jitter", size=4)
gg<-ggplot_build(p)
gg$data[[1]]
  ymin lower middle upper ymax         outliers notchupper notchlower x PANEL group weight ymin_final
1 21.4 22.80   26.0 30.40 33.9                    29.62055   22.37945 1     1     1      1       21.4
2 17.8 18.65   19.7 21.00 21.4                    21.10338   18.29662 2     1     2      1       17.8
3 13.3 14.40   15.2 16.25 18.7 10.4, 10.4, 19.2   15.98120   14.41880 3     1     3      1       10.4
  ymax_final  xmin  xmax
1       33.9 0.625 1.375
2       21.4 1.625 2.375
3       19.2 2.625 3.375

xx<-gg$data[[1]][c("group","outliers")]
xx
  group         outliers
1     1                 
2     2                 
3     3 10.4, 10.4, 19.2

现在将group值更改为 4,6 和 8 以与cyl值相同。

xx$group<-c(4,6,8)

现在将此新数据框与原始数据框合并mtcars并另存为新数据框。然后应用函数来检查该级别mpg是否列出了详细值。这些值(TRUE 和 FALSE)保存在列中。outlierscylout

mtcars.new<-merge(mtcars,xx,by.x="cyl",by.y="group")
mtcars.new$out<-apply(mtcars.new,1,function(x) x$mpg %in% x$outliers)

使用新数据框绘制数据。删除异常值表格geom_boxplot()。使用列out来确定点的形状和大小。与scale_shape_manual()调整scale_size_manual()外观。

ggplot(mtcars.new, aes(factor(cyl), mpg)) + 
          geom_boxplot(outlier.shape = NA)  +
          geom_point(aes(color=mpg,shape=out,size=out),  position="jitter")+
          scale_shape_manual(values=c(16,10),guide="none")+
          scale_size_manual(values=c(4,8),guide="none")

在此处输入图像描述

于 2013-03-28T16:48:04.220 回答