Ігноруйте людей, що переживають люди в ggplot2 boxplot


132

Як я б ігнорував людей, що не впадають у програму 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")

введіть тут опис зображення


Деякі зразкові дані та відтворюваний приклад полегшать вам допомогу.
Андрі

3
мій файл - 200 мег! Просто візьміть будь-який набір даних, де є багато точок даних між 1-м та 3-м квантилом та кількома видатками (вам знадобиться лише 1). Якщо спорядження далеко від 1-го / 3-го, тоді ящики обов'язково збираються, щоб розмістити
спорядження

Так, це я мав на увазі. Створіть такий набір даних і використовуйте dput (), щоб розмістити його тут разом із оператором ggplot (), який ви використовуєте. Допоможіть нам, щоб допомогти вам.
Андрі

Ви не можете просто змінити межі осі у, щоб "збільшити" ту частину, яка вас цікавить?
Гевін Сімпсон

2
дозвольте мені подивитися .... О так, вибачте. Просто зробіть fivenum()дані, щоб витягти те, що, IIRC, використовується для верхньої та нижньої петлі на Boxplots і використовуйте цей вихід у scale_y_continuous()виклику, який показав @Ritchie. Це можна легко автоматизувати за допомогою інструментів R та ggplot. Якщо вам потрібно також включити вуса, подумайте про використання boxplot.stats()верхньої та нижньої меж вусів і скористайтеся пунктом далі scale_y_continuous().
Гевін Сімпсон

Відповіді:


141

Ось рішення за допомогою 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 для автоматичних обчислень, +1 для використання координат-картезіанського масштабування, а не для виключення даних
Бен Болкер

2
@Ben - у вас два облікові записи? =) @Ramnath - це справді елегантне рішення
SFun28

7
Використовуючи вищевказаний метод, обмеження можуть бути зміщені невеликою крайністю з одного боку і великою крайністю з іншого, наприклад, ylim <- c(-0.1, 1000) * 1.05дає [1] 0.105 1050. Щоб отримати рівні межі навколо середнього значення, яке ви могли б використовувати ylim + c(-0.05, 0.05) * diff(ylim) / 2. Гарніша на мій погляд.
Брам Віссер

2
@ Ramnath, що робить $ stats [c (1,5)]?
lukeg

3
Якщо ви не працюєте facet_grid(). Тоді у вас є кілька множинних боксерів замість однієї. Таким чином, ви не отримуєте правильних меж.
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 (limit = ...) Це видалить дані, які виходять за межі, а потім виконати статистичні розрахунки. Іншими словами, це вплине на середнє та інші підсумки. Якщо це те, що ти хочеш, то чудово. Альтернативою є використання координат_картезіан (межі = ...) - це "збільшує" масштаб, не видаляючи даних і не впливаючи на підсумки.
Андрі

@Andrie - дякую! Я не хочу, щоб середні та інші резюме впливали на це.
SFun28

1
coord_cartesian()з coord_flip()мого досвіду не грає добре , тому я вважаю за краще scale_y_continuous().
PatrickT

1
Це найкраще рішення. Причиною, за якою я ховаю приховати людей, що переживають люди, є те, що я також будую геометричні точки за допомогою джоймерів. У цьому випадку люди, що випадають, просто перешкоджають та роблять вигляд, що там більше балів, ніж має бути.
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. виконати перший прохід, дізнатися, що таке межі, наприклад, розріз у заданому перцентилі або N стандартне відхилення вище середнього, або ...

  2. у другому проході встановіть значення, що перевищують задану межу, на значення цієї межі

Я мушу наголосити, що це старомодний метод, у якому мали б домінувати більш сучасні надійні методи, але ви все ще багато цього стикаєтеся.


1
Хто тільки мовчки відмовився : залиште коментар, щоб пояснити, чому .
Дірк Еддельбуеттель

Чи не я. Хотілося лише додати, що наявність вусів, які зупиняються на відсотках (як правило, 10-й та 90-й), здається, дуже часто зустрічається з даними про навколишнє середовище.
Річі Коттон

Я мовчав +1 , і хотів би, щоб я запропонував інший. Перемогу майже завжди здійснюють у сфері econ + finance. Якщо у SFun є екслієри, які руйнують візуалізацію даних, мені цікаво, який їх вплив на аналіз даних.
Річард Геррон

перечитуючи цю публікацію, ви згадали, що віндсорсинг - це більш стара техніка .... які були б більш сучасні методи?
SFun28

1
Загалом, надійні методи як розвиток останніх 30+ років.
Дірк Еддельбюттель

2

Опція "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)

3
Він просто розширює вуса, він не змінює масштаб діаграми
Moody_Mudskipper

2

Якщо ви хочете змусити вуса розширюватися до значень max та min, ви можете налаштувати 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)

зображення р0

зображення р1


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.
Гільдас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.