Добавить столбчатые графики с накоплением внутри фасетных графиков

#r #ggplot2 #facet #geom-bar #stacked-chart

#r #ggplot2 #фасет #геометрическая шкала #диаграмма с накоплением

Вопрос:

Я строю 3 столбца / символьных вектора в фасетной гистограмме и хотел бы иметь возможность отображать «курильщика» в виде сложенной гистограммы внутри каждой гистограммы.

Пример данных

Я использую ggplot2. Мне уже удалось отобразить «edu» и «sex», но я также хотел бы иметь возможность видеть количество каждого «y» и «n» внутри каждой столбчатой диаграммы «sex» (разделенной по оси x на «edu»). Я прикрепил изображение моего графика,

Результирующий график

чего я добился, введя следующий код:

Я попытался ввести аргумент «fill = smoker» в aes, но это не сработало. Если у кого-нибудь есть какие-либо предложения о том, как очистить код, который я использовал, чтобы превратить график в фасетный и выразить его в процентах, я также был бы очень благодарен, поскольку я взял его откуда-то еще.

 test <- read.csv('test.csv', header = TRUE)
library(ggplot2)
ggplot(test, aes(x= edu, group=sex))   
    geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count", show.legend = FALSE)  
    geom_text(aes( label = scales::percent(..prop..),
                   y= ..prop.. ), stat= "count", vjust = -.5, size = 3)  
    labs(y = NULL, x="education")  
    facet_grid(~sex)  
    scale_y_continuous(labels = scales::percent)
  

Комментарии:

1. Где test ?

2. это просто то, что я назвал .csv. Это на изображении [1]

Ответ №1:

Не уверен, что это то, что вы ищете, но я изо всех сил старался ответить на ваш вопрос.

 library(tidyverse)
library(lubridate)
library(scales)


test <- tibble(
 edu = c(rep("hs", 5), rep("bsc", 3), rep("msc", 3)),
 sex = c(rep("m", 3), rep("f", 4), rep("m", 4)),
 smoker = c("y", "n", "n", "y", "y", rep("n", 3), "y", "n", "n"))


test %>%
 count(sex, edu, smoker) %>%
 group_by(sex) %>%
 mutate(percentage = n/sum(n)) %>%
 ggplot(aes(edu, percentage, fill = smoker))  
 geom_col()  
 geom_text(aes(label = percent(percentage)),
   position = position_stack(vjust = 0.5))  
 facet_wrap(~sex)  
 scale_y_continuous(labels = scales::percent)  
 scale_fill_manual(values = c("#A0CBE8", "#F28E2B"))
  

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

Комментарии:

1. Спасибо. Да, это тот эффект, который я хотел. Мне нужно будет найти способ, чтобы проценты на графиках представляли накопленное значение в процентах от каждой группы (edu), а не в процентах от пола.