position_dodge(), похоже, не работает с переменными stat_summary() и x с разными группами заполнения

#r

#r

Вопрос:

Использование stat_summary(geom = "bar) stat_summary(geom = "errorbar") , похоже, не работает position_dodge() в случае x значений с разным количеством групп условий.

Я пытаюсь создать (что должно быть простым) гистограмму ggplot2 . Мои данные содержат несколько разных выборок (переменная x), и некоторые из этих выборок также имеют переменную fill ( condition ) («Scr» или «shRNA»), в то время как другие этого не делают ( condition = NA ). Когда я пытаюсь отобразить эти данные с помощью stat_summary оболочек для построения графиков с полосами ошибок, position_dodge функция для полос ошибок работает только с образцами, которые не имеют разных групп заливки. stat_summary(geom = "barplot") Кажется, что он работает, потому что отдельные столбцы отображаются, но их столбцы ошибок не выровнены.

 test <- data.frame(Sample = c(rep("A",6),rep("B",3)),
                   Target = c(rep("GENE1",9)),
                   val = c(1.1,1.2,1.15,.5,.6,.7,.95,1,1.05),
                   condition = c(rep("Scr",3),rep("shRNA",3),rep(NA,3)))



g <- ggplot(data=test,aes(x=Sample,y=val,fill=condition))  
  stat_summary(geom = "bar", fun.y = mean,position = position_dodge2(width=.5,preserve = "single"),color="black",width=.8)  
  stat_summary(geom = "errorbar", fun.data = mean_se, position = position_dodge2(width=.2,preserve = "single"),width=.2)  
  scale_y_continuous(expand = expand_scale(mult = c(0,.2)))  
  #scale_fill_discrete(guide=guide_legend(title="",nrow=2))

 

Я ожидаю position_dodge() , что аргумент в обоих stat_summary() ‘s выровняет полосы ошибок в правильном x положении, независимо от того, имеет ли этот конкретный образец одну или две группы заливки.

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

Ответ №1:

Я немного смущен тем, что вы пытаетесь сделать. Почему бы не использовать geom_col / geom_bar вместо stat_summary ? Я всегда предпочитаю разделять обработку / обобщение данных и построение графиков.

Это то, что я бы сделал

 library(tidyverse)
test %>%
    group_by(Sample, condition) %>%
    summarise(val.mean = mean(val), val.sd = sd(val)) %>%
    ggplot(aes(Sample, val.mean, fill = condition))  
    geom_col(position = position_dodge(width = 0.8))  
    geom_errorbar(
        aes(ymin = val.mean - val.sd, ymax = val.mean   val.sd),
        position = position_dodge(width = 0.8),
        width = 0.2)
 

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

Комментарии:

1. Это действительно работает, и после того, как я повозился с моим исходным кодом, похоже, что проблема на самом деле связана с использованием «position_dodge2 ()» вместо исходного «position_dodge ()». Использование оригинальной функции «position_dodge ()» работает даже с функцией stat_summary (). Спасибо!