Например, у меня есть рамка данных, как показано ниже, с колонками gender, year, count.

gender year count  
Man    2020 220     
Man    2019 206     
Man    2018 216     
Man    2017 156             
Woman  2020 45      
Woman  2019 47

Тогда я хотел бы поместить '%' на каждый сложенный бар с 100% на каждый бар в целом. Я пробовал, но все, что я могу получить, это разделенные %, основанные на общем количестве баров.

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

Например, в 2020 году я хотел бы иметь "Мужчину" с % от (220 / 220 + 45), а "Женщину" с (45 / 220 + 45).

Этот код мне надоел.

ggplot(data = all_gen, aes(x = year, y = count, fill = gender)) +
  geom_col() +
  geom_text(aes(label = paste0(round(count / sum(count) * 100, 1), "%")), position = position_stack(vjust = 0.5), vjust = 0.5, hjust = 0.3, size = 4.5, col = "black") +
  labs(x = "", y = "Count", title = "Gender by year") 

Что я могу сделать?

Sean

Ответов: 1

Ответы (1)

Вы можете рассчитать процент для каждого года, а затем построить график с помощью ggplot2 :

library(dplyr)
library(ggplot2)

all_gen %>%
  group_by(year) %>%
  mutate(percentage = paste(round(prop.table(count) * 100, 2), '%')) %>%
  ggplot(aes(x = year, y = count, fill = gender, label = percentage)) + 
  geom_col() + 
  geom_text(position = position_stack(vjust = 0.5), 
            hjust = 0.5, size = 4.5, col = "black") + 
  labs(x = "", y = "Count", title = "Gender by year")

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

Может быть, изменение оси Y на процент вместо подсчета было бы лучшей идеей.


all_gen %>%
  group_by(year) %>%
  mutate(percentage = round(prop.table(count) * 100, 2)) %>%
  ggplot(aes(x = year, y = percentage, fill = gender, 
             label = paste0(percentage, '%'))) + 
  geom_col() + 
  geom_text(position = position_stack(vjust = 0.5), 
            hjust = 0.5, size = 4.5, col = "black") + 
  labs(x = "", y = "Percentage", title = "Gender by year")

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

2022 WebDevInsider