R 如何生成geom“箱线图异常值”;“排队”;用抖动的几何点?
如何使geom_箱线图异常值与抖动的geom_点完美叠加 例如,我希望geom_箱线图中的异常值在抖动后显示为geom_点的实际点上的“十字线”R 如何生成geom“箱线图异常值”;“排队”;用抖动的几何点?,r,graphics,ggplot2,R,Graphics,Ggplot2,如何使geom_箱线图异常值与抖动的geom_点完美叠加 例如,我希望geom_箱线图中的异常值在抖动后显示为geom_点的实际点上的“十字线” 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="j
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
库(ggplot2)
这个溶液会很长。问题是使用position=“jitter”
无法获得点的精确坐标,所以需要找到解决方法
因此,使用ggplot\u build()
保存原始绘图。数据的第一个元素包含有关箱线图的信息。我们对列组
和异常值
感兴趣,因为它显示了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
现在将此新数据帧与原始的mtcars
合并,并另存为新数据帧。然后应用该功能检查该cyl
级别的outliers
中是否列出了详细信息mpg
值。这些值(TRUE和FALSE)保存在列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)
我同意迪兹的观点,即一个完全符合你目标的解决方案将相当复杂。要真正做到你的建议,需要(我认为)在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")
id\u异常值
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")
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")