Ігноруйте людей, що переживають люди в 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.