如何在R中绘制按性别拆分的收入Top20职业堆叠条形图
R语言按性别拆分堆叠条形图实现方案
步骤说明
- 首先保留原有逻辑筛选出的收入Top20职业,确保和之前的统计范围一致
- 基于筛选出的20个职业,计算每个职业不同性别的平均收入
- 调整数据格式后直接用
barplot生成堆叠条形图
完整可运行代码(兼容你原有基础绘图逻辑)
# 原有逻辑:计算各职业平均收入,筛选Top20 pay <- tapply(exp$INC, exp$OCC, mean) toppay <- sort(pay, decreasing = TRUE)[1:20] # 新增1:提取Top20职业列表,过滤原数据集 top_occs <- names(toppay) exp_top <- exp[exp$OCC %in% top_occs, ] # 新增2:计算分职业分性别的平均收入,按原收入高低排序 pay_by_sex <- tapply(exp_top$INC, list(exp_top$OCC, exp_top$SEX), mean) # 匹配Top20职业的排序,避免条形顺序错乱 pay_by_sex <- pay_by_sex[match(top_occs, rownames(pay_by_sex)), ] # 可选:缺失值补0,避免某职业无对应性别数据时报错 pay_by_sex[is.na(pay_by_sex)] <- 0 # 绘制堆叠横向条形图 barplot(t(pay_by_sex), # 转置矩阵,保证每个职业对应一个堆叠条形 las = 1, cex.names = 0.6, main = "Top 20最高收入职业分性别平均收入", xlab = "家庭总收入", col = c("#f8766d", "#00bfc4"), # 可自定义性别对应颜色 horiz = TRUE, legend.text = colnames(pay_by_sex), # 自动读取性别值做图例 args.legend = list(x = "bottomright", cex = 0.8)) # 调整图例位置大小
可选ggplot2实现(样式调整更灵活)
如果你已经安装了ggplot2和dplyr包,也可以用以下代码实现:
library(ggplot2) library(dplyr) # 统计分职业分性别的平均收入 exp_stat <- exp %>% filter(OCC %in% top_occs) %>% group_by(OCC, SEX) %>% summarise(avg_inc = mean(INC), .groups = "drop") %>% # 按收入高低给职业排序,保证图表顺序和原有逻辑一致 mutate(OCC = factor(OCC, levels = rev(top_occs))) # 绘制堆叠条形图 ggplot(exp_stat, aes(x = avg_inc, y = OCC, fill = SEX)) + geom_col(position = "stack") + labs(title = "Top 20最高收入职业分性别平均收入", x = "家庭总收入", y = "职业") + theme_minimal() + theme(axis.text.y = element_text(size = 6))
内容的提问来源于stack exchange,提问作者Kate Davies
相关产品推荐
相关产品推荐

