使百分比参与分组但由另一个变量着色

Posted

技术标签:

【中文标题】使百分比参与分组但由另一个变量着色【英文标题】:Making percentages attending to group but color by another variable 【发布时间】:2021-12-12 18:24:21 【问题描述】:

我正在尝试使用 ggplot 在 R 中制作条形图。该图应该代表不同长度的百分比,每个方面代表一个分类变量。我想通过第三个变量为条形着色。这是我正在做的模拟:

lengths <- sample(x = c(12, 15, 20, 25, 30, 32, 35, 40, 45, 60), size = 1000, replace = TRUE)
group <- sample(c("A", "B", "C", "D"), size = 1000, replace = TRUE)
sex <- sample(c("Female", "Male"), size = 1000, replace = TRUE)

data <- data.frame(lengths = lengths, sex = sex, group = group)
rm(lengths, group, sex)

ggplot(data = data %>% 
         bind_rows(data %>% 
                     mutate(group = "Total")), aes(x = lengths, group = group, fill = sex)) + 
  geom_bar(aes(y = ..prop..), color = "black", stat = "count") +
  labs(y = "%", fill = "sex") +
  facet_wrap(~ group, nrow = 6, strip.position = "right", scales = "free") +
  scale_x_continuous(limits = c(20,80)) +
  scale_y_continuous(labels = scales::percent) +
  theme(legend.position = c(.75, .95), legend.background = element_rect(fill = "white", color = "black"), axis.line = element_line(color = "black"), panel.background = element_blank(), legend.direction = "horizontal", strip.background = element_blank(), strip.text.y = element_blank()) +
  scale_color_discrete(guide = "none") +
  scale_fill_manual(values = c("purple", "blue", "gray"))

但是结果不是我想要的,因为所有的条都是灰色的,而不是按性别填充的:

这是我用来计算每组(不是性别)中计数比例的代码。如果我不考虑 group 参数,则比例显示错误。

所以本质上我仍然想显示相对于每个不同组的比例,但用其他分类变量填充条形。

有什么办法解决这个问题吗?

谢谢

【问题讨论】:

【参考方案1】:

只需删除 group=group:

`ggplot(data = data %>% 
         bind_rows(data %>% 
                     mutate(group = "Total")), aes(x = lengths, fill = sex)) + 
  geom_bar(aes(y = ..prop..), color = "black", stat = "count") +
  labs(y = "%", fill = "sex") +
  facet_wrap(~ group, nrow = 6, strip.position = "right", scales = "free") +
  scale_x_continuous(limits = c(20,80)) +
  scale_y_continuous(labels = scales::percent) +
  theme(legend.position = c(.75, .95), legend.background = element_rect(fill = "white", color = "black"), axis.line = element_line(color = "black"), panel.background = element_blank(), legend.direction = "horizontal", strip.background = element_blank(), strip.text.y = element_blank()) +
  scale_color_discrete(guide = "none") +
  scale_fill_manual(values = c("purple", "blue", "gray"))`

我花了很长时间才弄明白。

【讨论】:

否,百分比不是参照组计算的。如果将该更改应用于示例,您可以看到 y 轴如何更改为另一个百分比。 我不认为从 facet_wrap 调用中删除“ scales = 'free' ”是可以接受的? 那也解决不了 遗憾的是,这超出了我的知识范围,但我认为答案必须涉及在调用 ggplot 之前进行数据转换,因为很明显 group 和 fill 在设置时不兼容。

以上是关于使百分比参与分组但由另一个变量着色的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化百分比显示实战:纵轴显示为百分比在柱状图上显示百分比按照因子变量绘制分组子图(纵轴显示为百分比)可视化图中显示数据百分比

同一个表的所有记录由一个字段相关但由另一个字段查询 - sqlserver

将group_by和count()应用到变量后计算总计的百分比

我如何基于一定值在jupyter中对数据进行分组?

oracle分组求和并求百分比

每天按列和行、计数和百分比分组