ggplot2ボックスプロットの外れ値を無視


132

ggplot2ボックスプロットの外れ値を無視するにはどうすればよいですか?私は単にそれらを非表示にしたくない(つまり、outlier.size = 0)のではなく、それらを無視して、y軸が1/3パーセンタイルを示すようにスケーリングするようにします。私の外れ値が原因で、「ボックス」が非常に小さくなり、実際には線が小さくなっています。これに対処するためのテクニックはありますか?

編集 例は次のとおりです。

y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")

ここに画像の説明を入力してください


いくつかのサンプルデータと再現可能な例を使用すると、支援が容易になります。
Andrie

3
私のファイルは200メガです!1番目と3番目の分位数といくつかの外れ値の間に多くのデータポイントがあるデータセットを使用してください(1つだけ必要です)。外れ値が
1/3

はい、そう思いました。そのようなデータセットを作成し、dput()を使用して、使用するggplot()ステートメントと一緒にここにポストします。あなたを助けるために私たちを助けてください。
Andrie、

y軸の制限を変更して、興味のあるy軸の一部を「ズーム」できませんか?
Gavin Simpson、

2
見てみましょう。ただやるfivenum()、箱ひげ図の上に上下のヒンジのために使用されているものを、IIRC抽出し、その中に出力を使用したデータにscale_y_continuous()@Ritchieを示したことをコール。これは、Rおよびggplotが提供するツールを使用して、非常に簡単に自動化できます。ウィスカも含める必要がある場合は、を使用boxplot.stats()してウィスカの上限と下限を取得し、で使用することを検討してscale_y_continuous()ください。
Gavin Simpson

回答:


140

これがboxplot.statsを使用した解決策です

# create a dummy data frame with outliers
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))


# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
p1 = p0 + coord_cartesian(ylim = ylim1*1.05)

15
自動計算用の+1、データを除外するのではなくcoord_cartesianを使用してズームするための+1
ベンボルカー

2
@ベン-あなたは2つのアカウントを持っていますか?=)@Ramnath-これは本当にエレガントなソリューションです
SFun28

7
上記の方法を使用すると、制限は片側に小さな極値、もう一方に大きな極値によってバイアスされる可能性があります。たとえばylim <- c(-0.1, 1000) * 1.05[1] 0.105 1050。あなたが使用できる平均の周りに等しい制限を取得するにはylim + c(-0.05, 0.05) * diff(ylim) / 2。私の意見ではよりきれいです。
Bram Visser、2015年

2
@Ramnath $ stats [c(1,5)]は何をしますか?
lukeg

3
を使用している場合、は機能しませんfacet_grid()。次に、1つではなく複数の箱ひげ図があります。したがって、適切な制限がありません。
WitheShadow

204

geom_boxplot(outlier.shape = NA)外れ値を表示せずscale_y_continuous(limits = c(lower, upper))、軸の範囲を変更するために使用します。

例。

n <- 1e4L
dfr <- data.frame(
  y = exp(rlnorm(n)),  #really right-skewed variable
  f = gl(2, n / 2)
)

p <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot()
p   # big outlier causes quartiles to look too slim

p2 <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot(outlier.shape = NA) +
  scale_y_continuous(limits = quantile(dfr$y, c(0.1, 0.9)))
p2  # no outliers plotted, range shifted

実際、ラムナスが彼の答えで(そしてアンドリーもコメントで)示したように、統計を計算した後、を使用してスケールをトリミングする方が理にかなっていますcoord_cartesian

coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))

(おそらくscale_y_continuous、軸ブレークを修正するためにを使用する必要があります。)


1
だから私はより低い/より高いを計算しなければならないでしょう-おそらく1/3パーセンタイルを計算することによって?異常値を無視してインテリジェントにスケーリングするようにgg-plot2に指示する自動魔法の方法がないという意味ですか?
SFun28

38
scale_y_continuous(limits = ...)に注意してください。これにより、制限外のデータが削除され、統計計算が実行されます。言い換えれば、平均と他の要約が影響を受けます。これがあなたが望むものであれば、それから素晴らしいです。代わりの方法は、coord_cartesian(limits = ...)を使用することです。これは、データを削除したり、集計に影響を与えたりすることなく「拡大」します。
Andrie

@Andrie-ありがとう!意地悪やその他の要約に影響を与えたくありません。
SFun28

1
coord_cartesian()coord_flip()私の経験では、でうまく機能しないので、私はを好みscale_y_continuous()ます。
PatrickT 2017年

1
これが最良の解決策です。外れ値を非表示にする理由は、geom_jitterを使用してジッターポイントもプロットするためです。この場合、外れ値は邪魔になり、本来あるべきよりも多くのポイントがあるように見えます。
williamsurles

14

同じ問題があり、Q1、Q2、中央値、ymin、ymaxの値を次のように事前に計算しましたboxplot.stats

# Load package and generate data
library(ggplot2)
data <- rnorm(100)

# Compute boxplot statistics
stats <- boxplot.stats(data)$stats
df <- data.frame(x="label1", ymin=stats[1], lower=stats[2], middle=stats[3], 
                 upper=stats[4], ymax=stats[5])

# Create plot
p <- ggplot(df, aes(x=x, lower=lower, upper=upper, middle=middle, ymin=ymin, 
                    ymax=ymax)) + 
    geom_boxplot(stat="identity")
p

結果は外れ値のない箱ひげ図です。 ここに画像の説明を入力してください


9

1つのアイデアは、2パスの手順でデータをウィンソライズすることです。

  1. 最初のパスを実行して、境界が何であるかを学習します。たとえば、特定のパーセンタイルでのカット、または平均を超えるN標準偏差、または...

  2. 2番目のパスでは、指定された境界を超える値をその境界の値に設定します

これは昔ながらの方法であり、よりモダンで堅牢な手法が主流であるはずですが、それでも多くの方法に出くわすことを強調しておきます。


1
黙って反対票を投じた人:コメントを残して理由を説明してください。
Dirk Eddelbuettel、2011

私じゃなかった。パーセンタイル(通常は10番目と90番目)で止まるひげを持つことは、環境データでは非常に一般的であるように思われることを付け加えたいだけです。
リッチーコットン

私は黙って+1をしていたので、他に申し出てほしい。Winsorizingは、ほとんどの場合、econ +ファイナンスで行われます。SFunにデータの視覚化を台無しにする外れ値がある場合、データ分析への影響はどうなるのでしょうか。
Richard Herron、2011

この投稿を再読していましたが、ウインドソライジングは古いテクニックだとおっしゃっていました。
SFun28

1
一般に、過去30年以上の発展としての堅牢な方法。
Dirk Eddelbuettel、

2

geom_boxplot関数の「coef」オプションを使用すると、四分位範囲の観点から外れ値のカットオフを変更できます。このオプションは、関数stat_boxplotについて説明されています。外れ値を非アクティブ化するには(つまり、外れ値を通常のデータとして扱う)、デフォルト値の1.5を使用する代わりに、非常に高いカットオフ値を指定できます。

library(ggplot2)
# generate data with outliers:
df = data.frame(x=1, y = c(-10, rnorm(100), 10)) 
# generate plot with increased cutoff for outliers:
ggplot(df, aes(x, y)) + geom_boxplot(coef=1e30)

3
それはひげを伸ばすだけで、チャートをまったく再
スケールし

2

ひげを最大値と最小値まで拡張する場合は、coef引数を微調整できます。のデフォルト値coefは1.5です(つまり、ひげのデフォルトの長さはIQRの1.5倍です)。

# Load package and create a dummy data frame with outliers 
#(using example from Ramnath's answer above)
library(ggplot2)
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

# create boxplot where whiskers extend to max and min values
p1 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)), coef = 500)

p0の画像

p1の画像


2

Ipaper :: geom_boxplot2はまさにあなたが欲しいものです。

# devtools::install_github('kongdd/Ipaper')
library(Ipaper)
library(ggplot2)
p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot2(width = 0.8, width.errorbar = 0.5)

ここに画像の説明を入力してください


ありがとう!! 私のデータでテストされ、完全に機能しています!私はこのソリューションをお勧めしますが、githubの安定性/長期サポートについてはわかりません。
ギルダス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.