2016-02-29 2 views
5

Я хотел бы построить горизонтальную грань гранью с населением медианной этой грани.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

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

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

, но оно прекращено (появляется ошибка «Нет stat, называемого StatHline»).

Другого solution предложил

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

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

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

Наконец, есть способ построить медиану путем создания dummy table с желаемой статистикой, но я хотел бы избежать.

ответ

9

Вы можете создать дополнительную колонку в 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

 Смежные вопросы

  • Нет связанных вопросов^_^