Использовать счетчик по оси Y, но проценты и рассчитывать как метки - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь создать гистограмму в R из фрейма данных, который имеет значения по оси Y, но отображает в виде меток конкатенацию процентов и значений.

Мой фрейм данных выглядит следующим образом:

ID    Response
1    No
2    Yes
3    No
..    ..

Конечным результатом, который я хотел бы получить, был бы график, показанный ниже

enter image description here

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Это полезное решение из другого вопроса по SO:

library(ggplot2)
library(scales)
data.frame(response = sample(c("Yes", "No"), size = 100, replace = T, prob = c(0.4, 0.6))) %>% 
  ggplot(aes(x = response)) + 
  geom_bar(aes(y = (..count..)/sum(..count..))) + 
  geom_text(aes(y = ((..count..)/sum(..count..)), 
            label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) +
  scale_y_continuous(labels = percent) + 
  labs(title = "Proportion of Responses", y = "Percent", x = "Response")

enter image description here

0 голосов
/ 10 февраля 2019

Это должно помочь вам:

library(tidyverse)

df %>%
  group_by(Response) %>%
  summarise(count = n()) %>%
  mutate(Label = paste0(count, " - ", round(count / sum(count) * 100, 2), "%")) %>%
  ggplot(aes(x = Response, y = count)) +
  geom_bar(stat = 'identity', fill = 'lightblue') +
  geom_text(aes(label = Label)) +
  theme_minimal()

Решение, как указано выше, может заключаться в создании столбца Label, который затем можно передать в geom_text при необходимости.

Aфиктивный фрейм данных:

df <- data.frame(
  ID = c(1:100),
  Response = c(rep("Yes", 60), rep("No", 40))
)
0 голосов
/ 10 февраля 2019

Я бы попробовал что-то вроде ниже.Замечательно, что вы используете summarize и mutate;Я думаю, по привычке я иногда использую базовые функции, такие как table.

library(tidyverse)
resps<-sample(c("yes", "no"), 850, replace=T)

percents<-round(100*table(resps)/length(resps),2)
counts<-as.numeric(table(resps))

plotdat<-data.frame(percents, counts=counts, response=rownames(percents))


plotdat %>% ggplot(aes(response, counts)) +
    geom_col()+
    geom_text(aes(y=counts+10), label=paste(percents,"%  ", counts))
    labs(y="respondents")+
    theme_classic()
...