ggplot2: добавить метки к процентному графику (не position = fill, а просто fill) - PullRequest
1 голос
/ 19 апреля 2020

Я хотел бы добавить процентные метки к процентному барплоту

Я нашел решения с position="fill" ( Добавить процентные метки к сложенному барплоту ), а также здесь ( Как Чтобы нарисовать столбцы в ggplot2, которые показывают проценты в зависимости от группы? ), я бы хотел сохранить относительные частоты для каждой группы.

Вот пример графика:

# library
library(ggplot2)

# data  
df <- data.frame(group=c("A","A","A","A","B","B","B","C","C"),
                   anon=c("yes","no","no","no","yes","yes","no","no","no"))

# percentage barplot
  ggplot(df, aes(group),fill=anon) + 
    geom_bar(aes(y = (..count..)/sum(..count..),fill=anon)) + 
    scale_y_continuous(labels=scales::percent) +
    ylab("relative frequencies")

Создано в 2020-04-19 пакетом Представить (v0.3.0)

Теперь я хотел бы добавьте процентные метки к каждой красной и зеленой части каждого столбца, чтобы я получил значения «относительный относительный» (например, 25% для «да» для группы А). Как это может быть сделано? Должен ли я изменить свой df для этого или это как-то возможно в функции ggplot

1 Ответ

1 голос
/ 19 апреля 2020

Возможным решением является вычисление пропорции вне ggplot2, здесь я использую dplyr для вычисления этих различных пропорций:

library(dplyr)

df_calculated <- df %>% count(group, anon) %>%
  mutate(Percent_col = n / sum(n)) %>%
  group_by(group) %>%
  mutate(Percent = n/sum(n))

# A tibble: 5 x 5
# Groups:   group [3]
  group anon      n Percent_col Percent
  <fct> <fct> <int>       <dbl>   <dbl>
1 A     no        3       0.333   0.75 
2 A     yes       1       0.111   0.25 
3 B     no        1       0.111   0.333
4 B     yes       2       0.222   0.667
5 C     no        2       0.222   1    

А затем использовать geom_col вместо geom_bar для нарисуйте гистограмму и geom_text, чтобы добавить текстовую метку для каждой пропорции:

library(dplyr)
library(ggplot2)

ggplot(df_calculated, aes(x = group, y = Percent_col, fill = anon))+
  geom_col()+
  scale_y_continuous(labels=scales::percent) +
  ylab("relative frequencies")+
  geom_text(aes(label = scales::percent(Percent)), position = position_stack(0.5))+
  geom_text(inherit.aes = FALSE, 
            data = df_calculated %>% 
              group_by(group) %>% 
              summarise(Sum = sum(Percent_col)),
            aes(label = scales::percent(Sum), 
                y = Sum, x = group), vjust = -0.5)

enter image description here

Отвечает ли он на ваш вопрос?

...