аннотировать boxplot в ggplot2

Я создал параллельную коробку с помощью ggplot2.

p <- ggplot(mtcars, aes(x=factor(cyl), y=mpg))
p + geom_boxplot(aes(fill=factor(cyl)))

Я хочу аннотировать минимальный, максимальный, 1-й квартиль, медиану и 3-й квартиль на графике. Я знаю, что geom_text() может это сделать, и, возможно, fivenum() будет полезно. Но я не могу понять, как именно я могу это сделать !. Эти значения должны отображаться на моем графике.


person Paul    schedule 24.06.2016    source источник


Ответы (3)


Самый лаконичный способ, который я могу придумать, - это использовать stat_summary. Я также сопоставил метки с эстетикой цвета, но вы, конечно, можете установить метки на один цвет, если хотите:

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

В приведенном выше коде мы используем quantile в качестве итоговой функции для получения значений меток. ..y.. относится к выходным данным функции quantile (в общем, ..*.. - это конструкция ggplot для использования значений, вычисленных в ggplot).

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

person eipi10    schedule 25.06.2016
comment
Хороший ответ. Хотя разница тривиальна, я не уверен, что ggplot использует ту же сводку Fivenum - так что различия могут быть. - person user20650; 26.06.2016
comment
@ user20650 (не пора ли вам дать себе более характерное имя SO?) не вызывает ли gpplot любую функцию, указанную в fun.y, так что не будет ли он просто вызывать функцию fivenum из stats? - person eipi10; 26.06.2016
comment
Теперь я понимаю вашу точку зрения. geom_boxplot использует quantile, но fivenum использует другой алгоритм. Я обновил свой ответ, чтобы использовать квантиль. - person eipi10; 26.06.2016

Один из способов - просто создать нужный data.frame и передать его geom_text или geom_label:

library(dplyr)

cyl_fivenum <- mtcars %>% 
    group_by(cyl) %>% 
    summarise(five = list(fivenum(mpg))) %>% 
    tidyr::unnest()

ggplot(mtcars, aes(x=factor(cyl), y=mpg)) + 
    geom_boxplot(aes(fill=factor(cyl))) + 
    geom_text(data = cyl_fivenum, 
              aes(x = factor(cyl), y = five, label = five), 
              nudge_x = .5)

коробчатая диаграмма с ярлыками

person alistaire    schedule 24.06.2016

Если кто-то имеет дело с большими диапазонами и должен преобразовать log10 свою ось Y, я нашел код, который отлично работает. Просто добавьте 10^..y.. и scale_y_log10(). Если вы не добавите 10^ перед ..y.., фактические значения квантилей будут преобразованы в журнал и отображаться как таковые.

Не работает

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.45), size=3.5) +
  scale_y_log10()+
  theme_bw()

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

Отлично работает

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", 10^..y..), color=factor(cyl)),
           position=position_nudge(x=0.45), size=3.5) +
  scale_y_log10()+
  theme_bw()

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

person TheSciGuy    schedule 19.04.2019
comment
Мне следовало прокрутить вниз 15 минут назад, я бился головой об стену, пытаясь понять, почему мои значения были неправильными! - person HikerT; 17.06.2020
comment
Рад, что смог помочь! - person TheSciGuy; 18.06.2020