Игнорировать выбросы в ggplot2 boxplot - PullRequest
112 голосов
/ 15 апреля 2011

Как бы я игнорировал выбросы в ggplot2 boxplot? Я не просто хочу, чтобы они исчезли (т.е. outlier.size = 0), но я хочу, чтобы они игнорировались так, чтобы ось Y масштабировалась, чтобы показать 1/3-й процентиль. Мои выбросы заставляют "коробку" уменьшаться настолько, что это практически линия. Есть какие-то методы, чтобы справиться с этим?

Редактировать Вот пример:

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

enter image description here

Ответы [ 7 ]

171 голосов
/ 15 апреля 2011

Используйте 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, чтобы исправить разрывы осей.)

125 голосов
/ 15 апреля 2011

Вот решение с использованием 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)
13 голосов
/ 20 сентября 2012

У меня была та же проблема, и я предварительно вычислил значения для 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

В результате получается блокпост, без выбросов.enter image description here

8 голосов
/ 15 апреля 2011

Одной из идей было бы winsorize данных в двухпроходной процедуре:

  1. выполнить первый проход, узнать, чтограницами являются, например, сокращение на данном процентиле, или N стандартного отклонения выше среднего, или ...

  2. во втором проходе, устанавливают значения, выходящие за пределы заданной границы, значениемэта граница

Я должен подчеркнуть, что это старомодный метод, в котором должны доминировать более современные надежные методы , но вы по-прежнемучасто сталкивался с этим.

3 голосов
/ 08 ноября 2017

Опция "coef" функции geom_boxplot позволяет изменить предельное значение выброса в терминах межквартильных диапазонов.Эта опция задокументирована для функции 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)
1 голос
/ 16 июля 2019

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)

enter image description here

1 голос
/ 22 февраля 2018

Если вы хотите, чтобы усы расширялись до максимальных и минимальных значений, вы можете настроить аргумент coef.Значение по умолчанию для coef равно 1,5 (т. Е. По умолчанию длина усов в 1,5 раза больше IQR).

# 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)

image of p0

image of p1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...