ボックスプロットと同じように外れ値の点に色を付けるには、外れ値を計算して別々にプロットする必要があります。私の知る限り、外れ値を色付けするための組み込みオプションは、すべての外れ値を同じ色にします。
ヘルプ ファイルの例
「geom_boxplot」ヘルプ ファイルと同じデータを使用:
ggplot(mtcars, aes(x=factor(cyl), y=mpg, col=factor(cyl))) +
geom_boxplot()

外れ値の色付け
これを行うにはもっと合理的な方法があるかもしれませんが、私は手で計算する方が好きなので、内部で何が起こっているかを推測する必要はありません。「plyr」パッケージを使用すると、範囲 [Q1 - 1.5 * IQR、Q3 + 1.5 * IQR] の外にある任意のポイントである外れ値を決定するためのデフォルト (Tukey) メソッドを使用するための上限と下限をすばやく取得できます。Q1 と Q3 はデータの 1/4 と 3/4 分位数であり、IQR = Q3 - Q1 です。これをすべて 1 つの巨大なステートメントとして記述することもできますが、'plyr' パッケージの 'mutate' 関数を使用すると、新しく作成された列を参照できるため、読みやすくデバッグしやすいように分割することもできます。
library(plyr)
plot_Data <- ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, upper.limit=Q3+1.5*IQR, lower.limit=Q1-1.5*IQR)
データ フレームを入力し、データ フレームを出力 ("d->d" プライ) として使用するため、'ddply' 関数を使用します。上記の 'ddply' ステートメントの 'mutate' 関数は、元のデータ フレームを保持し、追加の列を追加します。 の仕様は.(cyl)
、'cyl' 値のグループ化ごとに関数を計算するように指示します。
この時点で、箱ひげ図をプロットし、外れ値を新しい色付きの点で上書きできます。
ggplot() +
geom_boxplot(data=plot_Data, aes(x=factor(cyl), y=mpg, col=factor(cyl))) +
geom_point(data=plot_Data[plot_Data$mpg > plot_Data$upper.limit | plot_Data$mpg < plot_Data$lower.limit,], aes(x=factor(cyl), y=mpg, col=factor(cyl)))

コードで行っていることは、空の「ggplot」レイヤーを指定してから、独立したデータを使用して boxplot と point ジオメトリを追加することです。boxplot ジオメトリは元のデータ フレームを使用できますが、一貫性を保つために新しい 'plot_Data' を使用しています。ポイント ジオメトリは、外れ値ステータスを判断するために新しい「lower.limit」列と「upper.limit」列を使用して、外れ値ポイントのみをプロットします。「x」と「col」の審美的な引数に同じ仕様を使用するため、ボックスプロットと対応する外れ値ポイントの間で色が魔法のように一致します。
更新: OP は、このコードで使用されている「ddply」関数のより完全な説明を要求しました。ここにあります:
関数の 'plyr' ファミリは、基本的に、データをサブセット化し、データの各サブセットに対して関数を実行する方法です。この特定のケースでは、次のステートメントがあります。
ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, upper.limit=Q3+1.5*IQR, lower.limit=Q1-1.5*IQR)
ステートメントが書かれる順序でこれを分解してみましょう。まず、「ddply」機能の選択。「mtcars」データの「cyl」の各値の下限と上限を計算します。これらの値を計算するために「for」ループまたはその他のステートメントを作成することもできますが、後で別のロジック ブロックを作成して異常値のステータスを評価する必要があります。代わりに、「ddply」を使用して下限と上限を計算し、それらの値をすべての行に追加します。データ フレームを入力し、データ フレームを出力として必要とするため、('dlply'、'd_ply' などではなく) 'ddply' を選択します。これにより、次のことがわかります。
ddply(
「mtcars」データ フレームでステートメントを実行したいので、それを追加します。
ddply(mtcars,
ここで、'cyl' 値をグループ化変数として使用して計算を実行します。次のように、「plyr」関数を使用.()
して、変数の値ではなく変数自体を参照します。
ddply(mtcars, .(cyl),
次の引数は、すべてのグループに適用する関数を指定します。計算で古いデータに新しい行を追加する必要があるため、「mutate」関数を選択します。これにより、古いデータが保持され、新しい計算が新しい列として追加されます。これは、グループ化変数を除く古い列をすべて削除する「要約」などの他の関数とは対照的です。
ddply(mtcars, .(cyl), mutate,
最後の一連の引数は、作成するすべての新しいデータ列です。これらは、名前 (引用符なし) と式を指定して定義します。まず、「Q1」列を作成します。
ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4),
「Q3」列も同様に計算されます。
ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4),
幸いなことに、「mutate」機能を使用すると、新しく作成された列を他の列の定義の一部として使用できます。これにより、1 つの巨大な関数を作成したり、複数の関数を実行したりする必要がなくなります。「IQR」変数の四分位範囲の計算には「Q1」と「Q3」を使用する必要がありますが、これは「mutate」関数を使用すると簡単です。
ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1,
私たちはついに今、私たちがなりたい場所にいます。技術的には「Q1」、「Q3」、「IQR」列は必要ありませんが、下限と上限の方程式を読みやすくデバッグしやすくします。理論式と同じように式を書くことができます。limits=+/- 1.5 * IQR
ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, upper.limit=Q3+1.5*IQR, lower.limit=Q1-1.5*IQR)
読みやすくするために中央の列を切り取ると、新しいデータ フレームは次のようになります。
plot_Data[, c(-3:-11)]
# mpg cyl Q1 Q3 IQR upper.limit lower.limit
# 1 22.8 4 22.80 30.40 7.60 41.800 11.400
# 2 24.4 4 22.80 30.40 7.60 41.800 11.400
# 3 22.8 4 22.80 30.40 7.60 41.800 11.400
# 4 32.4 4 22.80 30.40 7.60 41.800 11.400
# 5 30.4 4 22.80 30.40 7.60 41.800 11.400
# 6 33.9 4 22.80 30.40 7.60 41.800 11.400
# 7 21.5 4 22.80 30.40 7.60 41.800 11.400
# 8 27.3 4 22.80 30.40 7.60 41.800 11.400
# 9 26.0 4 22.80 30.40 7.60 41.800 11.400
# 10 30.4 4 22.80 30.40 7.60 41.800 11.400
# 11 21.4 4 22.80 30.40 7.60 41.800 11.400
# 12 21.0 6 18.65 21.00 2.35 24.525 15.125
# 13 21.0 6 18.65 21.00 2.35 24.525 15.125
# 14 21.4 6 18.65 21.00 2.35 24.525 15.125
# 15 18.1 6 18.65 21.00 2.35 24.525 15.125
# 16 19.2 6 18.65 21.00 2.35 24.525 15.125
# 17 17.8 6 18.65 21.00 2.35 24.525 15.125
# 18 19.7 6 18.65 21.00 2.35 24.525 15.125
# 19 18.7 8 14.40 16.25 1.85 19.025 11.625
# 20 14.3 8 14.40 16.25 1.85 19.025 11.625
# 21 16.4 8 14.40 16.25 1.85 19.025 11.625
# 22 17.3 8 14.40 16.25 1.85 19.025 11.625
# 23 15.2 8 14.40 16.25 1.85 19.025 11.625
# 24 10.4 8 14.40 16.25 1.85 19.025 11.625
# 25 10.4 8 14.40 16.25 1.85 19.025 11.625
# 26 14.7 8 14.40 16.25 1.85 19.025 11.625
# 27 15.5 8 14.40 16.25 1.85 19.025 11.625
# 28 15.2 8 14.40 16.25 1.85 19.025 11.625
# 29 13.3 8 14.40 16.25 1.85 19.025 11.625
# 30 19.2 8 14.40 16.25 1.85 19.025 11.625
# 31 15.8 8 14.40 16.25 1.85 19.025 11.625
# 32 15.0 8 14.40 16.25 1.85 19.025 11.625
対照的に、'summarize' 関数を使用して同じ 'ddply' ステートメントを実行すると、代わりにすべて同じ回答が得られますが、他のデータの列はありません。
ddply(mtcars, .(cyl), summarize, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, upper.limit=Q3+1.5*IQR, lower.limit=Q1-1.5*IQR)
# cyl Q1 Q3 IQR upper.limit lower.limit
# 1 4 22.80 30.40 7.60 41.800 11.400
# 2 6 18.65 21.00 2.35 24.525 15.125
# 3 8 14.40 16.25 1.85 19.025 11.625