组合geom_bar y轴上的多个变量

问题描述 投票:0回答:1

到目前为止,我已经创建了一个条形图,显示每个种族类别对各种儿童保育活动做出贡献的百分比,该数字按儿童保育活动划分。

我如何向 y 轴添加其他变量?

例如,如果我还想计算男性和女性的百分比,并将它们添加到 y 轴,种族类别下方(通过数据中的“性别”变量)。我最初的尝试只成功创建了一个新的单一“性别种族”变量,这不是我想要的。

dtest %>%
  filter(race2 != "Other NH") %>% 
  pivot_longer(cols = starts_with("ccare_"), 
               names_to = "ccare_variable", 
               values_to = "response") %>%
  group_by(ccare_variable, race2) %>%
  summarise(percent_yes = weighted.mean(response == 1, useweight, na.rm = TRUE) * 100, .groups = "drop") %>%
  
  ggplot(aes(x = reorder(race2, percent_yes), y = percent_yes, fill = race2)) +
  geom_bar(stat = "identity", 
           color = "black", 
           alpha = 0.7) +
  coord_flip() +
  labs(x = NULL, 
       y = "Percent") +
  scale_x_discrete(labels = levels(dtest$race2)) +
  scale_fill_brewer(palette = "Set1") +
  facet_wrap(~ ccare_variable, scales = "free_y") +  
  theme_minimal(base_size = 15) +
  theme(panel.grid = element_blank(),
        legend.position = "bottom")
dtest <- structure(list(ccare_livewlong_person = structure(c(NA, NA, NA, 
0, NA, NA, NA, 0, NA, NA, NA, 1, NA, NA, 0, 0, 1, 0, NA, NA, 
0, NA, NA, NA, NA, NA, NA, NA, NA, NA), format.stata = "%12.0g", labels = c(No = 0, 
Yes = 1), class = c("haven_labelled", "vctrs_vctr", "double")), 
    ccare_staywith_person = structure(c(NA, NA, NA, 0, NA, NA, 
    NA, 1, NA, NA, NA, 0, NA, NA, 1, 1, 0, 0, NA, NA, 0, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA), format.stata = "%12.0g", labels = c(No = 0, 
    Yes = 1), class = c("haven_labelled", "vctrs_vctr", "double"
    )), ccare_buyclothes_person = structure(c(NA, NA, NA, 0, 
    NA, NA, NA, 1, 1, 1, NA, 1, NA, 0, 0, 0, 0, 0, NA, NA, 
    0, NA, NA, NA, NA, 1, 1, 1, 1, NA), format.stata = "%12.0g", labels = c(No = 0, 
    Yes = 1), class = c("haven_labelled", "vctrs_vctr", "double"
    )), ccare_buyfood_person = structure(c(NA, NA, NA, 0, NA, 
    NA, NA, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, NA, NA, 0, 
    NA, NA, NA, NA, 1, 0, NA, NA, NA), format.stata = "%12.0g", labels = c(No = 0, 
    Yes = 1), class = c("haven_labelled", "vctrs_vctr", "double"
    )), ccare_buytoys_person = structure(c(NA, NA, NA, 0, NA, 
    NA, NA, 0, 1, 1, NA, 0, NA, NA, 0, 0, 1, 0, NA, NA, 0, 
    NA, NA, NA, NA, 1, NA, NA, NA, NA), format.stata = "%12.0g", labels = c(No = 0, 
    Yes = 1), class = c("haven_labelled", "vctrs_vctr", "double"
    )), ccare_payeduc_person = structure(c(NA, NA, NA, 0, NA, 
    NA, NA, 0, 1, NA, 0, 1, 0, 0, 0, 0, 1, 0, NA, NA, 1, 
    NA, NA, NA, NA, NA, NA, NA, 0, NA), format.stata = "%12.0g", labels = c(No = 0, 
    Yes = 1), class = c("haven_labelled", "vctrs_vctr", "double"
    )), race2 = structure(c(1L, 1L, 2L, 1L, 1L, 1L, 1L, 4L, 4L, 
    1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 5L, 1L, 1L, 5L, 1L, 
    1L, 1L, 5L, 5L, 1L, 1L), levels = c("White NH", "Black NH", 
    "Hispanic", "Nat Am NH", "Other NH"), class = "factor"), 
    sex = structure(c(2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 
    1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 
    1L, 1L, 1L, 2L, 2L), levels = c("M", "F"), class = "factor"), 
    useweight = structure(c(0.12316239125, 1.10825384945, 0.56176074875, 
    0.55257337975, 0.4109339601, 0.64619988635, 0.31264390035, 
    0.26356887575, 0.26356887575, 0.18757221085, 0.3727184159, 
    0.36235486655, 0.23228683015, 0.43385255745, 0.8295457014, 
    0.8295457014, 0.3762255673, 0.2436195251, 0.5951818102, 0.116057867, 
    0.24554129075, 0.38657110555, 0.0957898253, 0.97274405485, 
    0.97274405485, 0.1407062719, 0.2918493845, 0.2918493845, 
    0.21775501005, 0.2139179732), label = "Weights", format.stata = "%10.0g")), row.names = c(NA, 
-30L), class = c("tbl_df", "tbl", "data.frame"))
r ggplot2
1个回答
0
投票

一种选择是分别汇总每个变量的数据,然后使用例如

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 = "Percent"
  ) +
  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"
  )

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.