Boxplot ggplot2: Показать среднее значение и количество наблюдений в сгруппированной прямоугольной диаграмме - PullRequest
0 голосов
/ 17 июня 2020

I wi sh, чтобы добавить количество наблюдений в эту коробчатую диаграмму, не по группам, а с разделением по коэффициенту. Кроме того, я использую sh, чтобы отобразить количество наблюдений в дополнение к метке оси x, которая выглядит примерно так: («PF (N = 12)»). Кроме того, я хотел бы отобразить среднее значение каждого поля внутри поля, отображаемое в миллионах, чтобы не было гигантского числа для каждого поля.

Вот что у меня получилось:

    give.n <- function(x){
    return(c(y = median(x)*1.05, label = length(x)))
    }

    mean.n <- function(x){x <- x/1000000
    return(c(y = median(x)*0.97, label = round(mean(x),2)))
    }


    ggplot(Soils_noctrl) +  
    geom_boxplot(aes(x=Slope,y=Events.g_Bacteria, fill = Detergent), 
               varwidth = TRUE) +
    stat_summary(aes(x = Slope, y = Events.g_Bacteria), fun.data = give.n, geom = "text", 
               fun = median,
               position = position_dodge(width = 0.75))+
    ggtitle("Cell Abundance")+
    stat_summary(aes(x = Slope, y = Events.g_Bacteria), 
               fun.data = mean.n, geom = "text", fun = mean, colour = "red")+
    facet_wrap(~ Location, scale = "free_x")+
    scale_y_continuous(name = "Cell Counts per Gram (Millions)", 
                     breaks = round (seq(min(0), 
                                         max(100000000), by = 5000000),1),
                     labels = function(y) y / 1000000)+
    xlab("Sample")

И пока это выглядит так: Как видите, среднее значение находится внизу графика, а количество наблюдений указано в квадратах, но не разделено

Спасибо за вашу помощь! Ура

1 Ответ

0 голосов
/ 18 июня 2020

TL; DR - вам необходимо указать group= aestheti c, поскольку ggplot2 не знает, в каких данных столбца предполагается уклоняться от текста geom.

К сожалению, мы не у вас нет ваших данных, но вот набор примеров, который может продемонстрировать обоснование здесь и функцию / потребность в group=.

set.seed(1234)
df1 <- data.frame(detergent=c(rep('EDTA',15),rep('Tween',15)), cells=c(rnorm(15,10,1),rnorm(15,10,3)))
df2 <- data.frame(detergent=c(rep('EDTA',20),rep('Tween',20)), cells=c(rnorm(20,1.3,1),rnorm(20,4,2)))
df3 <- data.frame(detergent=c(rep('EDTA',30),rep('Tween',30)), cells=c(rnorm(30,5,0.8),rnorm(30,3.3,1)))

df1$smp='Sample1'
df2$smp='Sample2'
df3$smp='Sample3'

df <- rbind(df1,df2,df3)

Вместо использования stat_summary() я просто собираюсь создать отдельный фрейм данных для хранения средних значений, которые я хочу включить в качестве текста в свой график:

summary_df <- df %>% group_by(smp, detergent) %>% summarize(m=mean(cells))

Теперь вот график и использование geom_text() с уклонением:

p <- ggplot(df, aes(x=smp, y=cells)) +
  geom_boxplot(aes(fill=detergent))

p + geom_text(data=summary_df,
    aes(y=m, label=round(m,2)),
    color='blue', position=position_dodge(0.8)
  )

enter image description here

Вы заметите, что все числа разделены вдоль y=, отлично, но «уклонение» не работает. Это потому, что мы не предоставили никакой информации о том, как делать уклонение. В этом случае можно указать group= aestheti c, чтобы ggplot2 знало, что это столбец, который следует использовать для уклонения:

p + geom_text(data=summary_df,
    aes(y=m, label=round(m,2), group=detergent),
    color='blue', position=position_dodge(0.8)
  )

enter image description here

У вас нет есть для поставки group= aestheti c, если вы поставляете другой aestheti c, например color= или fill=. В случаях, когда вы даете и color=, и group= aestheti c, group= aestheti c переопределит любой из других для целей уклонения. Вот пример того же, но где вам не нужен group= aestheti c, потому что я переместил color= вверх в aes() (изменение заливки на оттенки серого, чтобы вы могли видеть текст):

p + geom_text(data=summary_df,
      aes(y=m, label=round(m,2), color=detergent),
      position=position_dodge(0.8)
  ) + scale_fill_grey()

enter image description here

ЛЮБОПЫТНЫЙ ФАКТ : Уклонение все равно работает, даже если вы добавляете geom_text() бессмысленную эстетику c это обычно работает для уклонения, например fill=. Вы получаете предупреждающее сообщение Ignoring unknown aesthetics: fill, но уклонение все еще работает:

p + geom_text(data=summary_df,
      aes(y=m, label=round(m,2), fill=detergent),
      position=position_dodge(0.8)
  )
# gives you the same plot as if you just supplied group=detergent, but with black text

В вашем случае изменение строки stat_summary() на это должно работать:

stat_summary(aes(x = Slope, y = Events.g_Bacteria, group = Detergent),...
...