R语言绘制按年龄区间分组、分性别堆叠的分组堆叠条形图
实现方案
你需要先把宽格式的数据集转为长格式,把Male和Female两列合并为性别分组字段,才能实现堆叠效果。完整可运行代码如下:
# 加载依赖包 library(tidyverse) # 读取数据 data <- read.delim("emp1.txt", sep = "\t", header = TRUE) # 数据预处理 df1 <- data %>% as_tibble() %>% # 生成年龄区间分组 mutate(emp_class = cut(Count, breaks = c(0, 30, 40, 50, 60, 100), labels = c('(0-30)', '(31-40)', '(41-50)', '(51-60)', '(61-100)'))) %>% # 按岗位统计样本量生成x轴标签 group_by(Emp_group) %>% mutate(group_n = n()) %>% ungroup() %>% mutate(x_axis = paste(Emp_group, group_n, sep = "\n")) %>% # 宽表转长表,提取性别和对应人数 pivot_longer(cols = c(Male, Female), names_to = "性别", values_to = "人数") %>% # 计算每个岗位+年龄区间分组内的性别占比(不需要占比可以跳过这步) group_by(x_axis, emp_class) %>% mutate(占比 = 人数 / sum(人数) * 100) %>% ungroup() # 绘图:按岗位设x轴,年龄区间分组并排展示,性别堆叠 ggplot(df1, aes(x = interaction(x_axis, emp_class), y = 占比, fill = 性别, alpha = emp_class)) + geom_col(position = "stack", color = "white") + # 调整x轴标签只显示岗位信息 scale_x_discrete(labels = function(x) str_remove(x, "\\..*")) + # 调整图例和坐标轴标签 labs(x = "", y = "员工占比(%)", alpha = "年龄区间", fill = "性别") + theme(text = element_text(size = 20), axis.text.x = element_text(hjust = 0.5))
如果你不需要按占比展示,直接把y轴映射改为人数即可。上述代码会生成两个图例,分别对应年龄区间和性别,每个年龄区间的条形会自动堆叠男女的占比/人数。
内容的提问来源于stack exchange,提问作者BeginneR
相关产品推荐
相关产品推荐

