这个解决方案会很长。问题是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)保存在列中。outliers
cyl
out
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")