Комбинирование нескольких переменных по оси Y в geom_bar

Вопрос или проблема

На данный момент я создал столбчатую диаграмму, показывающую процент каждой категории расы, участвующей в различных деятельности по уходу за детьми, причем график разбит по видам деятельности. Как мне добавить дополнительные переменные на ось Y? Например, если я также хотел бы рассчитать процент мужчин и женщин и добавить их на ось Y, ниже категорий рас (по переменной ‘sex’ в данных). Мои первоначальные попытки лишь создали новую единую переменную ‘раса по полу’, что не является тем, что я хочу.

Один из вариантов – обобщить данные отдельно для каждой переменной, затем использовать, например, bind_rows для объединения обобщенных наборов данных. После этого вы могли бы использовать, например, facet_grid:
library(tidyverse)

dtest_long <- dtest %>%
filter(race2 != “Other NH”) %>%
pivot_longer(
cols = starts_with(“ccare_”),
names_to = “ccare_variable”,
values_to = “response”
) %>%
mutate(
response = haven::as_factor(response)
)

lapply(c(“race2”, “sex”), \(x) {
dtest_long |>
mutate(
group = x
) |>
rename(category = all_of(x)) |>
group_by(ccare_variable, category, group) %>%
summarise(
percent_yes = weighted.mean(response == “Yes”,
useweight,
na.rm = TRUE
) * 100, .groups = “drop”
)
}) |>
bind_rows() |>
mutate(ccare_variable = gsub(
“(ccare_|_person)”,
“”,
ccare_variable
)) |>
ggplot(aes(y = reorder(category, percent_yes), x = percent_yes, fill = category)) +
geom_bar(
stat = “identity”,
color = “black”,
alpha = 0.7
) +
labs(
x = NULL,
y = “Процент”
) +
scale_fill_brewer(palette = “Set1”) +
facet_grid(
group ~ ccare_variable,
scales = “free_y”, space = “free_y”
) +
theme_minimal(base_size = 15) +
theme(
panel.grid = element_blank(),
legend.position = “none”
)

Ответ или решение

Чтобы комбинировать несколько переменных на оси y в графике столбцов с использованием ggplot2 в R, вы можете сначала пересобрать ваши данные, а затем использовать соответствующие функции для агрегации и отображения. В вашем случае, вы хотите отобразить процентные значения по расам и полам в одном графике.

Для начала, вы уже правильно применяете предварительную обработку данных с использованием pivot_longer(). Поскольку вашей целью является создание одного графика, который визуализирует как расовые, так и половые категории, вам необходимо сделать несколько шагов:

  1. Подготовка данных: вам нужно будет сделать сводку для каждой переменной (расы и пола) и объединить эти результаты.

  2. Создание графика: использовать facet_grid для разделения графиков по переменной, например, по типу детской деятельности.

Ниже приведён пример, который расширяет ваш исходный код, чтобы учитывать как расу, так и пол:

library(tidyverse)

# Переподготовка данных
dtest_long <- dtest %>%
  filter(race2 != "Other NH") %>%
  pivot_longer(cols = starts_with("ccare_"),
               names_to = "ccare_variable",
               values_to = "response") %>%
  mutate(response = as.factor(response))

# Объединение данных по расе и полу
summary_data <- lapply(c("race2", "sex"), function(group_var) {
  dtest_long %>%
    group_by(ccare_variable, !!sym(group_var)) %>%
    summarise(percent_yes = weighted.mean(response == "1", useweight, na.rm = TRUE) * 100,
              .groups = "drop") %>%
    rename(category = !!sym(group_var), group = group_var)
}) %>%
  bind_rows() %>%
  mutate(ccare_variable = gsub("(ccare_|_person)", "", ccare_variable))

# Создание графика
ggplot(summary_data, aes(x = reorder(category, percent_yes), y = percent_yes, fill = category)) +
  geom_bar(stat = "identity", color = "black", alpha = 0.7) +
  coord_flip() +
  labs(x = NULL, y = "Процент") +
  scale_fill_brewer(palette = "Set1") +
  facet_grid(group ~ ccare_variable, scales = "free_y") +  
  theme_minimal(base_size = 15) +
  theme(panel.grid = element_blank(), legend.position = "none")

Объяснение кода:

  • Мы используем lapply для применения сводки отдельно для каждой переменной (расы и пола), агрегируя данные с помощью group_by() и summarise().
  • Мы объединили результаты в один датафрейм с помощью bind_rows().
  • При создании графика ggplot мы используем facet_grid, чтобы получить разные подграфики для расовой и половой группировки, что позволяет вам визуализировать данные по обоим параметрам одновременно.

Эта структура позволяет вам эффективно комбинировать различные категории на оси y и визуализировать процентные значения, как вы и планировали.

Оцените материал
Добавить комментарий

Капча загружается...