Как построить среднее значение одного фактора в гистограмме с помощью

У меня возникли проблемы с созданием фигуры с помощью ggplot2. На этом графике я использую geom_bar для построения трех факторов. Я имею в виду, что для каждого «времени» и «дозы» я рисую два столбца (два генотипа).

Чтобы быть более конкретным, я имею в виду следующее: введите описание изображения здесь

Это мой код до сих пор (на самом деле я изменил некоторые настройки, но я представляю только то, что нужно):

 ggplot(data=data, aes(x=interaction(dose,time), y=b,  fill=factor(genotype)))+
 geom_bar(stat="identity", position="dodge")+
 scale_fill_grey(start=0.3, end=0.6, name="Genotype")

Вопрос. Я намерен добавить среднее значение каждого времени с использованием точек, и чтобы эти точки находились точно в середине столбцов определенного времени. Как я могу продолжить?

Я попытался добавить эти точки, используя geom_dotplot и geom_point, но мне это не удалось.


person Rafael Nalin    schedule 28.09.2016    source источник


Ответы (2)


library(dplyr)
time_data = data %>% group_by(time) %>% summarize(mean(b))
data <- inner_join(data,time_data,by = "time")

это дает вам данные с прикрепленными средствами. Теперь сделайте сюжет

 ggplot(data=data, aes(x=interaction(dose,time), y=b,fill=factor(genotype)))+
 geom_bar(stat="identity", position="dodge")+
 scale_fill_grey(start=0.3, end=0.6, name="Genotype")+
 geom_text(aes(b),vjust = 0)

Возможно, вам придется повозиться с аргументами hjust и vjust в операторе geom_text. Может и aes тоже, я программу не запускал, не знаю.

person Stephen    schedule 28.09.2016
comment
Большое спасибо, Степан! Ваш код заставляет меня понять, как добавить точки на мой график. На самом деле я написал по другому, но я организовал свои данные так, как вы сказали! geom_point(data=data, aes(y="mean(b)", x = x), colour = "red", size=1.5) Я создал столбец x, чтобы указать, где должны располагаться эти точки! Это сработало. Еще раз большое спасибо! - person Rafael Nalin; 03.10.2016

Обычно помогает, если вы можете привести воспроизводимый пример. Здесь я сделал некоторые из моих собственных данных.

sampleData <-
  data.frame(
    dose = 1:3
    , time = rep(1:3, each = 3)
    , genotype = rep(c("AA","aa"), each = 9)
    , b = rnorm(18, 20, 5)
  )

Вам нужно где-то вычислить средства, и я решил сделать это на лету. Обратите внимание, что вместо точек я использовал линию, чтобы показать, что среднее значение относится ко всем этим значениям. Я также сортировал по-другому и использовал facet_wrap для группировки вещей. Точки было бы немного сложнее разместить, особенно при использовании position_dodge, но вы, вероятно, могли бы изменить этот код, чтобы добиться этого.

ggplot(
  sampleData
  , aes(x = dose
        , y = b
        , fill = genotype)
  ) +
  geom_bar(position = "dodge", stat = "identity") +
  geom_hline(data = 
               sampleData %>%
               group_by(time) %>%
               summarise(meanB = mean(b)
                         , dose = NA, genotype = NA)
             , aes(yintercept = meanB)
             , col = "black"
              ) +
  facet_wrap(~time)

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

person Mark Peterson    schedule 28.09.2016
comment
Спасибо, Марк! Вы и Стивен очень помогли мне понять, как мне организовать свои данные. Я создал набор данных с помощью dose, time, genotype, b, mean(b), x. Как видите, я создал столбец x, чтобы указать, где эти точки должны располагаться на оси X! Я же написал: geom_point(data=data, aes(y="mean(b)", x = x), colour = "red", size=1.5) для построения точек по правильным координатам. Это сработало! Еще раз большое спасибо! - person Rafael Nalin; 03.10.2016