16

ggplot2の外れ値に色を付けるにはどうすればよいですか? ボックスプロット自体と同じ色にしたい。colour=これを行うには十分ではありません。

例:

p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot(aes(colour=factor(cyl)))

factor(cyl)外れ値も同様に色付けしたいと思います。これは動作しません:

> p <- ggplot(mtcars, aes(factor(cyl), mpg))
> p + geom_boxplot(aes(colour=factor(cyl), outlier.colour=factor(cyl)))
4

6 に答える 6

28

更新 (2015-03-31): >= 1.0.0の @tarch のソリューションを参照してくださいggplot2

ggplot2<= 0.9.3のソリューションは以下のとおりです。


@koshkeが言ったように、外れ値をボックスの線のように(塗りつぶしの色ではなく)色付けすることは、設定することで簡単に可能になりましたoutlier.colour = NULL

p <- ggplot(mtcars, aes(x=factor(cyl), y=mpg, col=factor(cyl)))
p + geom_boxplot(outlier.colour = NULL)

色付きの外れ値を含む箱ひげ図

  • outlier.colour「ou」で書く必要があります
  • outlier.colour外にいなければならないaes ()

これを何度も調べているので、これを遅い回答として投稿しています。関連する質問Boxplot にも投稿しました。外れ値の色を一致させて美学を埋める方法は?

于 2013-04-16T11:34:19.163 に答える
15

geom_boxplot(outlier.colour = NULL)Rの最新バージョンでは設定が機能しなくなったという事実に対する解決策を見つけました(@hamyはggplot2のバージョン1.0.0について語っています)。

@cbeleites が提案した動作を再現するには、次のコードを使用するだけです。

update_geom_defaults("point", list(colour = NULL))
m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
            colour = factor(Animation)))
m + geom_boxplot() + scale_y_log10()

予想どおり、これにより、線の色に一致する点を持つプロットが生成されます。

もちろん、複数のプロットを描画する必要がある場合は、デフォルトに戻すことを忘れないでください:

update_geom_defaults("point", list(colour = "black"))

解決策は、githubでggplot2の変更ログを読むことで見つかりました。

の外れ値はgeom_boxplot()、 のデフォルトの色、サイズ、および形状を使用します geom_point()geom_point()with のデフォルトを変更するupdate_geom_defaults()と、同じ変更が の外れ値に適用されます geom_boxplot()。外れ値のデフォルトを変更することは、以前は不可能でした。(@ThierryO、#757)

ここにも投稿: ggplot2 boxplot、外れ値の色を一致させて美学を埋めるにはどうすればよいですか?

于 2015-03-13T08:55:29.917 に答える
15

ボックスプロットと同じように外れ値の点に色を付けるには、外れ値を計算して別々にプロットする必要があります。私の知る限り、外れ値を色付けするための組み込みオプションは、すべての外れ値を同じ色にします。

ヘルプ ファイルの例

「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
于 2013-03-07T14:56:58.077 に答える
7

異なる要因 (boxplot グループの作成に使用されるものとは異なる) に従って外れ値ポイントの形状または色を変更する必要がある場合は、@Dinre の回答を適応させることができます。

ボックスプロット自体に色が使用されていない場合にのみ、点の色を変更できます (色に 2 つの変数を使用することはできません)。

@Dinreの回答のデータplot_Dataとコードを使用します-外れ値の色は要因に依存しcarbます。元の外れ値に引数outlier.shape = NAを追加geom_boxplot()することで、 によって過剰にプロットされないように外れ値が削除されgeom_point()ます。

ggplot() +
  geom_boxplot(data=plot_Data, aes(x=factor(cyl), y=mpg),outlier.shape = NA) + 
  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, color=factor(carb)))

ここに画像の説明を入力

ポイントの形状を変更するには:

ggplot() +
  geom_boxplot(data=plot_Data, aes(x=factor(cyl), y=mpg),outlier.shape = NA) + 
  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, shape=factor(carb)))

ここに画像の説明を入力

于 2013-03-07T14:03:44.017 に答える