この解決策はかなり長くなります。問題は、position="jitter"
ポイントの正確な座標を取得できないため、回避策を見つける必要があることです。
したがって、元のプロットを取得して、 で保存しggplot_build()
ます。data の最初の要素には、boxplot に関する情報が含まれています。列に興味が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")