Одно из возможных решений - начать с вычисления всех пропорций из ggplot2
.
Здесь приведен поддельный пример:
df <- data.frame(Type = sample(c("Sal","Self"),100, replace = TRUE),
Category = sample(c(0,1),100, replace = TRUE))
Мы можем вычислить каждую пропорцию следующим образом, чтобы получить окончательный фрейм данных:
library(tidyr)
library(dplyr)
df %>% group_by(Category, Type) %>% count() %>%
pivot_wider(names_from = Category, values_from = n) %>%
mutate(Total = `0`+ `1`) %>%
pivot_longer(-Type, names_to = "Category", values_to = "n") %>%
group_by(Category) %>%
mutate(Percent = n / sum(n))
# A tibble: 6 x 4
# Groups: Category [3]
Type Category n Percent
<fct> <chr> <int> <dbl>
1 Sal 0 27 0.458
2 Sal 1 22 0.537
3 Sal Total 49 0.49
4 Self 0 32 0.542
5 Self 1 19 0.463
6 Self Total 51 0.51
Затем, если у вас была последовательность ggplot2
, вы можете получить раф в одной последовательности:
df %>% group_by(Category, Type) %>% count() %>%
pivot_wider(names_from = Category, values_from = n) %>%
mutate(Total = `0`+ `1`) %>%
pivot_longer(-Type, names_to = "Category", values_to = "n") %>%
group_by(Category) %>%
mutate(Percent = n / sum(n)) %>%
ggplot(aes(x = reorder(Category, desc(Category)), y = Percent, fill = Type))+
geom_col()+
geom_text(aes(label = scales::percent(Percent)), position = position_stack(0.5))+
scale_y_continuous(labels = scales::percent)+
labs(y = "Percentage", x = "Category")
Это отвечает на ваш вопрос?