ggplot2: добавить hline с медианой популяции для каждой грани

Я хотел бы построить горизонтальную линию шириной с гранью с медианой популяции этой грани.

я попробовал подход без создания фиктивной сводной таблицы со следующим кодом:

require(ggplot2)

dt = data.frame(gr = rep(1:2, each = 500),
            id = rep(1:5, 2, each = 100), 
            y = c(rnorm(500, mean = 0, sd = 1), rnorm(500, mean = 1, sd = 2)))


ggplot(dt, aes(x = as.factor(id), y = y)) +
  geom_boxplot() +
  facet_wrap(~ gr) +
  geom_hline(aes(yintercept = median(y), group = gr), colour = 'red')

однако линия рисуется для медианы всего набора данных вместо медианы отдельно для каждого фасета: enter image description here

в прошлом, a решение было предложено использовать

  geom_line(stat = "hline", yintercept = "median")

но это было discontinued (создает ошибку "нет статистики, называемой StatHline").

еще один решение предложил

 geom_errorbar(aes(ymax=..y.., ymin=..y.., y = mean))

но он генерирует

Error in data.frame(y = function (x, ...)  : 
arguments imply differing number of rows: 0, 1000

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

1 ответов


Вы можете создать дополнительный столбец в dt для медианы за грань.

library(dplyr) # With dplyr for example
dt <- dt %>% group_by(gr) %>%
  mutate(med = median(y))

# Rerun ggplot line with yintercept = med
ggplot(dt, aes(x = as.factor(id), y = y)) +
  geom_boxplot() +
  facet_wrap(~ gr) +
  geom_hline(aes(yintercept = med, group = gr), colour = 'red')

enter image description here