Как отображать надписи в geom_text, пропорциональные групповой переменной geom_bar

Я пытался вывести в ggplot график, который показывает метки в процентах и ​​пропорционально коэффициенту группирования, определенному в geom_bar. Вместо значений%, пропорциональных генеральной совокупности, я хотел бы вывести значение метки, пропорциональное каждой подгруппе (в данном случае место A и место B), но мне это не удалось. См. Воспроизводимый пример ниже.

Воспроизводимый фрейм данных

Random<-data.frame(replicate(3,sample(0:3,3024,rep=TRUE)))
Random$Trxn_type <- sample(c("Debit", "Credit"),
                       size = nrow(Random), 
                       prob = c(0.76, 0.24), replace = TRUE)
Random$YN <- sample(c("Yes", "No"),
                       size = nrow(Random), 
                       prob = c(0.76, 0.24), replace = TRUE)
Random$Place <- sample(c("PlaceA", "PlaceB"),
                       size = nrow(Random), 
                       prob = c(0.76, 0.24), replace = TRUE)

Random<-Random[, 4:6]

Затем применил следующий код

Share<-ggplot(Random, aes(x = YN, fill=Place)) +
scale_fill_brewer(palette="Greens")+
geom_bar(aes(y = ..prop.., group = Place),position = position_dodge()) + 
facet_wrap(~ Random$Trxn_type, scales = "free_x", ncol=2)+ 
theme(strip.text.x = element_text(size = 15, colour = "black"))+
theme(panel.background = element_rect(fill = "white"),legend.position = "bottom")+
scale_y_continuous(labels = percent)+
ylab("Frequency") + 
coord_flip()+ 
xlab("Answers") + 
theme(plot.title = element_text(size = 16, face = "bold"),
      axis.text=element_text(size=12),
      axis.title=element_text(size=12))+
geom_text(aes(y=..prop..,label=scales::percent((..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..])),
          stat="count", vjust=-.5, position=position_dodge(.9)) 
Share

И получил следующий вывод

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

Вместо этого процентного распределения я хотел бы видеть процентное значение ответов, рассматривающих место A и место B как две отдельные группы. Проще говоря, я хотел бы, чтобы метки отображали значение%, соответствующее размеру столбцов гистограммы, таким образом, чтобы гистограммы для места A в кредитах суммировали до 100, а гистограммы для места B в кредитах - до 100. То же самое применимо и к дебету.

Спасибо!


person Nicola    schedule 26.01.2020    source источник


Ответы (1)


Вот решение, которое вычисляет пропорции с помощью dplyr, а затем передает результат в ggplot.
Я также поместил все настройки theme в тот же вызов theme().
Я повторно разместил код создания данных, на этот раз установив Начальное значение ГСЧ для воспроизводимости примера данных.

library(dplyr)
library(ggplot2)

Random %>%
  count(Trxn_type, YN, Place) %>%
  left_join(Random %>% count(Trxn_type, name = "m"), by = "Trxn_type") %>%
  mutate(Prop = n/m) %>%
  ggplot(aes(x = YN, y = Prop, fill = Place)) +
  geom_col(position = position_dodge()) +
  geom_text(aes(label = scales::percent(Prop)),
            hjust = -0.25, 
            position = position_dodge(0.9)) +
  facet_wrap(~ Trxn_type, scales = "free_x", ncol = 2) +
  scale_fill_brewer(palette = "Greens") +
  scale_y_continuous(limits = c(0, 1), labels = scales::percent) +
  xlab("Answers") +
  ylab("Frequency") +
  coord_flip() +
  theme(panel.background = element_rect(fill = "white"),
        legend.position = "bottom",
        strip.text.x = element_text(size = 15, colour = "black"),
        plot.title = element_text(size = 16, face = "bold"),
        axis.text = element_text(size = 12),
        axis.title = element_text(size = 12))

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

Изменить.

Следуя комментарию OP, вот способ подсчета на Place. Единственное изменение в приведенном выше коде - это left_join инструкция.

  left_join(Random %>% count(Trxn_type, Place, name = "m"),
            by = c("Trxn_type", "Place")) %>%

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

Код создания данных.

set.seed(1234)
Random <- data.frame(replicate(3,sample(0:3,3024,rep=TRUE)))
Random$Trxn_type <- sample(c("Debit", "Credit"),
                           size = nrow(Random),
                           prob = c(0.76, 0.24), replace = TRUE)
Random$YN <- sample(c("Yes", "No"),
                    size = nrow(Random),
                    prob = c(0.76, 0.24), replace = TRUE)
Random$Place <- sample(c("PlaceA", "PlaceB"),
                       size = nrow(Random),
                       prob = c(0.76, 0.24), replace = TRUE)

Random <- Random[, 4:6]
person Rui Barradas    schedule 26.01.2020
comment
Спасибо за это решение, но я хотел получить другой тип вывода. Если в месте A проживает до 100 человек, столбцы гистограммы для места A должны составлять в сумме до 100, и то же самое применимо к гистограммам для места B. Пример, которым я поделился, и соответствующие ярлыки, суммирующие до 100 для места A и места B как отдельных групп? Спасибо - person Nicola; 27.01.2020