Вопрос или проблема
На данный момент я создал столбчатую диаграмму, показывающую процент каждой категории расы, участвующей в различных деятельности по уходу за детьми, причем график разбит по видам деятельности. Как мне добавить дополнительные переменные на ось 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()
. Поскольку вашей целью является создание одного графика, который визуализирует как расовые, так и половые категории, вам необходимо сделать несколько шагов:
-
Подготовка данных: вам нужно будет сделать сводку для каждой переменной (расы и пола) и объединить эти результаты.
-
Создание графика: использовать
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 и визуализировать процентные значения, как вы и планировали.