Пометьте усы на ggplot boxplot, когда есть выбросы - PullRequest
1 голос
/ 03 июня 2019

Я хочу обозначить концы усов на полях ggplot, а не минимальные и максимальные значения, которые в моих данных часто являются выбросами.

Я пытался использовать код, найденный здесь: аннотировать блокпост в ggplot2 , но, как вы можете видеть из вывода в множителе (cyl) = 8 (синий), абсолютный минимуми отмечены максимальные значения, а не точки, где заканчиваются усы.

Это вывод: enter image description here

ggplot(mtcars, aes(x=factor(cyl), y=mpg, fill=factor(cyl))) + 
  geom_boxplot(width=0.6) +
  stat_summary(geom="text", fun.y=quantile,
           aes(label=sprintf("%1.1f", ..y..), color=factor(cyl)),
           position=position_nudge(x=0.33), size=3.5) +
theme_bw()

В данном примере я хочупомечены усы на коэффициенте (цил), а не выбросы.

Спасибо за любую помощь, которую вы все можете предоставить.

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Бокплоты используют boxplots.stats. Вы можете напрямую использовать это в вашем stat_summary:

ggplot(mtcars, aes(x=factor(cyl), y=mpg, fill=factor(cyl))) + 
  geom_boxplot(width=0.6) +
  stat_summary(
    aes(label=sprintf("%1.1f", ..y..), color=factor(cyl)),
    geom="text", 
    fun.y = function(y) boxplot.stats(y)$stats,
    position=position_nudge(x=0.33), 
    size=3.5) +
  theme_bw()

enter image description here

Если вам нужны только усы, просто используйте boxplot.stats(y)$stats[c(1, 5)].

0 голосов
/ 04 июня 2019

добро пожаловать

Вид работ тм, я не понимаю, почему 8 цилиндров ломается

library(tidyverse)

outlier_range <- function(x) {
  first_quantile  <-  quantile(x,0.25)
  third_quantile <-  quantile(x,0.75)
  iqr <- IQR(x)
  outlier_lower <- max(min(x), first_quantile  - 1.5 * iqr)
  outlier_higher <- min(max(x), third_quantile + 1.5 * iqr) 

  return(c(outlier_lower, outlier_higher))
}


ggplot(mtcars) +
  aes(x=factor(cyl), y=mpg, fill=factor(cyl)) + 
  geom_boxplot(width=0.6) +
  theme_bw() +
  stat_summary(geom="text", fun.y=outlier_range,
               aes(label=sprintf("%1.1f", ..y..), color=factor(cyl)),
               position=position_nudge(x=0.33), size=3.5)

Пигбинг на @Axeman:

ggplot(mtcars, aes(x=factor(cyl), y=mpg, fill=factor(cyl))) + 
  geom_boxplot(width=0.6) +
  stat_summary(
    aes(label=sprintf("%1.1f", ..y..), color=factor(cyl)),
    geom="text", 
    fun.y = function(y) boxplot.stats(y)$stats[c(1,5)],
    position=position_nudge(x=0.33), 
    size=3.5) +
  theme_bw()
...