Как добавить метки с количеством наблюдений в stat_summary ggplot? - PullRequest
3 голосов
/ 03 февраля 2020

У меня есть набор данных, например,

outcome <- c(rnorm(500, 45, 10), rnorm(250, 40, 12), rnorm(150, 38, 7), rnorm(1000, 35, 10), rnorm(100, 30, 7))
group <- c(rep("A", 500), rep("B", 250), rep("C", 150), rep("D", 1000), rep("E", 100))
reprex <- data.frame(outcome, group)

Я могу построить это как "динамитный" график с:

graph <- ggplot(reprex, aes(x=group, y=outcome, fill=..y..)) +
  stat_summary(geom = "bar", fun.y = mean) +
  stat_summary(geom = "errorbar", fun.data = mean_cl_normal, width = 0.1)

, давая:

picture of graph

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

graph + geom_label (aes(label=paste(..count.., "Obs.", sep=" ")), y=-0.75, size=3.5, color="black", fontface="bold")

, который возвращает

Error in paste(count, "Obs.", sep = " ") : 
  cannot coerce type 'closure' to vector of type 'character'

Я также пытался

  graph + stat_summary(aes(label=paste(..y.., "Obs.", sep=" ")), fun.y=count, geom="label")

, но это возвращает:

Error: stat_summary requires the following missing aesthetics: y

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

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

3 голосов
/ 03 февраля 2020

Не создавая новый фрейм данных, вы можете получить счет, используя dplyr и рассчитав его («на лету») следующим образом:

library(dplyr)
library(ggplot2)
ggplot(reprex, aes(x=group, y=outcome, fill=..y..)) +
  stat_summary(geom = "bar", fun.y = mean) +
  stat_summary(geom = "errorbar", fun.data = mean_cl_normal, width = 0.1)+
  geom_label(inherit.aes = FALSE, data = . %>% group_by(group) %>% count(), 
            aes(label = paste0(n, " Obs."), x = group), y = -0.5)

enter image description here

2 голосов
/ 03 февраля 2020

Вы не можете использовать stat = "count", когда уже объявлена ​​переменная ay. Я бы сказал, что самым простым способом было бы создать небольшой кадр данных для счетчиков:

label_df = reprex %>% group_by(group) %>% summarise(outcome=mean(outcome),n=n())

Затем построить график с использованием этого

ggplot(reprex, aes(x=group, y=outcome, fill=..y..)) +
  stat_summary(geom = "bar", fun.y = mean) +
  stat_summary(geom = "errorbar", fun.data = mean_cl_normal, width = 0.1)+
  geom_text(data=label_df,aes(label=paste(n, "Obs.", sep=" ")), size=3.5, color="black", fontface="bold",nudge_y =1)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...