Как включить количество наблюдений в каждом квартиле боксплота, используя ggplot2 в R? - PullRequest
0 голосов
/ 21 октября 2019

Я строю рамочную диаграмму, чтобы увидеть распределение переменной. Мне также интересно видеть количество наблюдений в каждом квартиле. Есть ли способ добавить количество наблюдений в каждом квартиле к участку вместе со значениями квартилей?

Я включил ниже некоторый код, который может генерировать блок-график со значениями квартилей.

df <- datasets::iris
boxplot <- ggplot(df, aes(x = "", y = Sepal.Length)) +
  geom_boxplot(width=0.1, position = "dodge", fill = "red") +
  stat_boxplot(geom = "errorbar", width = 0.1) +
  stat_summary(geom = "label_repel", fun.y = quantile, aes(label = ..y..),
               position = position_nudge(x = -0.1), size = 3) +
  ggtitle("") +
  xlab("") +
  ylab('Sepal.Length')

Я ожидаю значения квартилей в левой части графика и количество наблюдений в правой части графика, если это возможно.

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

это была бы одна возможность. Я всегда предпочитаю, чтобы мои дополнительные данные использовались в качестве дополнительного фрейма данных, потому что это дает мне больше контроля над тем, что и как рассчитывается. HTH, Тоби

1 голос
/ 28 октября 2019

@ TobiO ответ правильный. Но мои данные были немного искажены, и некоторые точки разреза были одинаковыми (например, первая и вторая точки разреза были одинаковыми). Мне нужно было взять уникальные значения, чтобы рассчитать количество наблюдений в каждом квартиле. Другой момент связан с использованием функции cut, которая не включает начальную точку (нижняя граница, верхняя граница). Чтобы включить начальную точку, я использовал функцию cut2 из пакета Hmisc. Iдобавлена ​​строка label_pos_extension, чтобы предотвратить наложение метки / текста для квартилей, точки разреза которых очень близки друг к другу. geom_text_repel не сработало для предотвращения перекрытий.

quantile_counts2 <- function(x){
  label_pos_extension <- c(0,3,4,0)
  if(length(unique(quantile(x))) < 5){
    df <- data.frame(label = table(cut2(x, g = 4)),
                 label_pos =  c(0, diff(unique(quantile(x))) / 2 + quantile(x)[1:length(unique(quantile(x)))-1]) + label_pos_extension[1:length(unique(quantile(x)))])
  } else {
    df <- data.frame(label = table(cut2(x, g = 4)),
                 label_pos = diff(quantile(x)) / 2 + quantile(x)[1:4] + label_pos_extension)
  } return(df)
}

PS. Я пытался добавить отредактированную функцию в комментарий, но она не сработала.

...