R: Добавление количества наблюдений на гистограмму с помощью geom_text

Я знаю, что этот вопрос задавали очень часто, но я перепробовал все методы, которые нашел, и ни один из них не работает.

Это мои текущие данные.

df <- data.frame(ID = c(1,2,3,4), Type = c("A","B","A","B"), Score1 = c(10,20,30,40), Score2 = c(20,40,60,80))
ID   Type    Score1       Score2
1       A        10           20
2       B        20           40
3       A        30           60
4       B        40           80

и теперь я хочу сделать график, который выглядит так Редактировать: я поместил не тот график> Он должен выглядеть так

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

Я могу получить гистограмму, используя reshape и ggplot

rawscore <- df[, c("Type","Score1", "Score2")]
rawscore <- melt(rawscore, id = c("Type"))
ggplot(rawscore, aes(type, value, fill=variable))+
geom_bar(stat="summary", fun.y="mean", position="dodge")

Тем не менее, я изо всех сил пытаюсь добавить количество наблюдений на график. Я знаю, что должен использовать geom_text, чтобы поместить метку на график, поэтому я попытался создать новый вектор из этого post

nlabels <- table(Type)

но я получил сообщение об ошибке

Error: Aesthetics must be either length 1 or the same as the data

Какие-либо предложения?


person Maru    schedule 19.07.2017    source источник


Ответы (2)


df <- data.frame(ID = c(1,2,3,4), Type = c("A","B","A","B"), Score1 = c(10,20,30,40), Score2 = c(20,40,60,80))


rawscore <- df[, c("Type","Score1", "Score2")]
rawscore <- melt(rawscore, id = c("Type"))

Попробуйте создать другой data.frame (EDIT)

library(dplyr)

dfmean <- rawscore %>% 
  group_by(interaction(variable, Type)) %>% 
  summarise(m = mean(value), count = n())
names(dfmean)[1] <- "Inter"

ggplot(rawscore, aes(x = interaction(variable, Type), y = value)) + 
  geom_bar(aes(fill = variable), stat="summary", fun.y="mean", position="dodge") +
  geom_text(data = dfmean, aes(x = Inter, y = m + 1, label = count))

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

person abichat    schedule 19.07.2017
comment
Мои извинения, я только что обновил свой график и команду, но я попробую и ваш метод. Тем не менее, я ищу, чтобы количество наблюдений на панели не было средним, но я посмотрю, смогу ли я поиграть с вашей командой. - person Maru; 19.07.2017
comment
Да, я вижу это. Так что попробуй dfmean <- rawscore %>% group_by(interaction(variable, Type)) %>% summarise(count = n()) - person abichat; 19.07.2017
comment
Я попробовал вашу команду выше, и она работает отлично!. Однако я потратил много времени, пытаясь применить это к моим фактическим данным, но у меня все еще есть Error: Aesthetics must be either length 1 or the same as the data (4) Есть идеи, в чем причина? Я запустил length для переменной, и это то же самое, что и данные... Ответ ниже работает, но я хочу применить этот метод для некоторого графика, который не требует reshape данных, чтобы я мог просто ссылаться на переменную подсчитайте все эти графики, не изменяя данные снова и снова. (если это имеет смысл?) - person Maru; 21.07.2017
comment
Я не знаю точно, что вы имеете в виду... Изменить форму ваших данных (с помощью reshape2 или dplyr) необходимо, потому что ggplot2 работает с аккуратными данными. - person abichat; 21.07.2017

Небольшое изменение в ответе @Florian.

library(dplyr)
rawscore <- df[, c("Type","Score1", "Score2")]
rawscore <- melt(rawscore, id = c("Type")) %>%
    group_by(variable) %>% summarize(value=mean(value), count = n())

ggplot(rawscore, aes(variable, value, fill=variable))+
    geom_bar(stat="identity") +
    geom_text(aes(label=count), vjust=0)

Это отлично работает

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

person Koundy    schedule 19.07.2017
comment
Что делает Melt() и в каких пакетах его можно найти? - person Lukas; 29.10.2018