ggplot boxplot, но с ячейками, простирающимися до 5-го и 95-го процентилей

#r #ggplot2

#r #ggplot2

Вопрос:

Я хотел бы, чтобы boxplot суммировал распределение некоторых базовых данных, но вместо усов, простирающихся до 5-го и 95-го, я бы хотел, чтобы блоки простирались до 5-го и 95-го.

Стандартный коробочный график с удаленными выбросами и усами:

 library("ggplot2")
p <- ggplot(mtcars, aes(factor(cyl), mpg))
p   geom_boxplot(outlier.shape = NA, coef = 0)
  

введите описание изображения здесь
Boxplot с усами на 5-м и 95-м процентилях:

 p   stat_summary(geom = "boxplot", 
                 fun.data = function(x) setNames(quantile(x, c(0.05, 0.25, 0.5, 0.75, 0.95)), 
                                                 c("ymin", "lower", "middle", "upper", "ymax")))
  

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

Но чего я действительно хочу, так это чтобы ячейки (без усов) простирались до 5-го и 95-го, так что комбинация обеих этих модификаций. Есть ли способ указать функцию, генерирующую поле в stat_summary() ?

Ответ №1:

Это может быть немного «хакерский» способ сделать это, но самым простым способом может быть просто использовать geom_segment для каждого класса цилиндров. Это позволит вам указать ширину boxplot и значения, которые вы хотите, чтобы boxplot достигал. Но затем вы могли бы поиграть с aes() ними, а также добавить срединную линию, используя stat_summary() при желании.

 library(ggplot2)
p <- ggplot(mtcars, aes(factor(cyl), mpg))
p   geom_segment(aes(x = 4, xend = 4, y = quantile(subset(mtcars, mtcars$cyl==4)$mpg,0.95), yend = quantile(subset(mtcars, mtcars$cyl==4)$mpg, 0.05)), color = 'firebrick1', lwd = 28)

  

Комментарии:

1. Спасибо @colonelforbin97, я не подумал geom_segment . Это может сработать, хотя для получения средних / средних линий потребуется больше (как вы упомянули), и я также хочу заполнить / раскрасить по группам, чтобы контурная линия соответствовала сгруппированной гистограмме (на самом деле происходит много, извините, следовало указать, что мне нужны другие «функции»boxplot). Подожду, чтобы принять это, надеясь, что есть более прямой путь, но это творческий подход, и я соглашусь, если ничего другого не появится!

2. Звучит хорошо @BryanMichael. Это, безусловно, «короткий» способ получения чего-то похожего на boxplot, но в конечном счете неэффективен, и его будет сложно интегрировать с другими функциями и графиками. Дайте нам знать, что вы придумали. Спасибо!