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

私は、あなたが目指していることを正確に行うソリューションがかなり関与するだろうというディジスに同意します. あなたが提案したことを文字通り行うには、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()ます。data の最初の要素には、boxplot に関する情報が含まれています。列に興味がgroupあり、 outliersggplot がどの値を外れ値として想定しているかを示しているためです。それらを別のオブジェクトとして保存します。

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 に答える