2011-10-28 4 views
5

私はボックスプロットをRに描き、名前を外れ値に追加したいと考えています。今まで私はthis solutionを見つけました。Boxplot外れ値ラベリングin R

私が必要とするすべての機能を提供する機能ですが、ラベルを誤ってスクランブルします。次の例では、外れ値を "o"ではなく "u"とマークしています。

library(plyr) 
library(TeachingDemos) 
source("http://www.r-statistics.com/wp-content/uploads/2011/01/boxplot-with-outlier-label-r.txt") # Load the function 
set.seed(1500) 
y <- rnorm(20) 
x1 <- sample(letters[1:2], 20,T) 
lab_y <- sample(letters, 20) 
# plot a boxplot with interactions: 
boxplot.with.outlier.label(y~x1, lab_y) 

解決方法はありますか? ggplot2ライブラリは素晴らしいですが、(私が知る限り)そのような機能は提供していません。私の選択肢は、text()関数を使用して、boxplotオブジェクトから異常値情報を抽出することです。しかし、このようにラベルは重なり合うかもしれません。たくさん

+2

アップデート:私はタルGaliliの注意にこのエラーをもたらし、そしてw /時間で、彼はもはやこの問題を示さないスクリプトの編集版を投稿した。 –

答えて

6

私はそれが機能的にbugがありますが判明しdebug(boxplot.with.outlier.label)でこれを見ていた、と...。

エラーはdata.frame DATAxylabel_nameから構成されたライン125上に発生します。

以前はxyが並び替えられましたが、lab_yはまだ並べられていません。 x(あなたのx1)の供給された値がそれ自体では既に順番になっていないとき、あなたは経験したような混乱を経験するでしょう。即時修正として

、あなたができるプリオーダーxこのような値(または複数のエレガントな何かを)

df <- data.frame(y, x1, lab_y, stringsAsFactors=FALSE) 
df <- df[order(df$x1), ] 
# Needed since lab_y is not searched for in data (though it probably should be) 
lab_y <- df$lab_y 

boxplot.with.outlier.label(y~x1, lab_y, data=df) 

Boxplot produced by procedure described above

+0

Josh:ありがとう。^_^ –

+0

ありがとうございました。私は数日前に同じ問題に遭遇したので、これは大きな助けとなりました+1 – pssguy

+1

喜んで助けてください。これは他の人には使い慣れているように見えるので、スクリプトの作成者に電子メールを送ったところ、スクリプトでエラーが見つかった場合にユーザーに指示するように求めました。 –

1

:-)

おかげintelligent point label placementは、別の問題がhereまたはhereを議論しています。究極の理想的なソリューションはありませんので、そこにあるものを選ぶだけです。

次のようにあなたは、ラベルの付いた通常の箱ひげ図を重ねてプロットします:

set.seed(1501) 
y <- c(4, 0, 7, -5, rnorm(16)) 
x1 <- c("a", "a", "b", "b", sample(letters[1:2], 16, T)) 
lab_y <- sample(letters, 20) 

bx <- boxplot(y~x1) 

out_lab <- c() 
for (i in seq(bx$out)) { 
    out_lab[i] <- lab_y[which(y == bx$out[i])[1]] 
} 

identify(bx$group, bx$out, labels = out_lab, cex = 0.7) 

その後、identify()中には実行されているhereが説明するように、あなたはちょうどあなたがラベルをしたい位置、 にクリックしてください。終了したら、 "STOP"を押すだけです。 各異常値は複数のラベルを持つことができます。私のソリューションでは、私は単に最初のものを選んだだけです!!

PS:forループは恥ずかしいですが、ベクトル化する方法はわかりません。改善を投稿することは自由です。

編集:Federico's linkに触発されましたが、今はもっと簡単に行うことができます。ただ、これらの2つのコマンド:

boxplot(y~x1) 
identify(as.integer(as.factor(x1)), y, labels = lab_y, cex = 0.7) 
+1

identify()ソリューションは素晴らしいですが、スケーラビリティはありません。何百ものプロットがあり、PDFとして印刷する必要があります:-) –

関連する問題