如何用ggplot2制作带计数的职场文化调查100%水平堆叠条形图?
解决方案
1. 数据预处理
首先对原始长格式数据做统计处理,完成Factor重命名、各等级计数/占比计算,以及Factor的排序:
library(tidyverse) work_culture_summary <- work_culture_data %>% # 替换Factor为中文名称,根据你的实际7个因子补充完整映射 mutate(Factor = case_match( Factor, "Level_career_prospects" ~ "职业前景", "Level_work_life_balance" ~ "工作生活平衡", "Level_team_collaboration" ~ "团队协作", "Level_management_support" ~ "管理层支持", "Level_compensation" ~ "薪酬福利", "Level_learning_opportunities" ~ "学习机会", "Level_work_environment" ~ "工作环境" )) %>% # 按Factor和Level分组统计响应数 count(Factor, Level) %>% # 计算每个Factor下各Level的占比(百分比) group_by(Factor) %>% mutate(percent = n / sum(n) * 100) %>% ungroup() %>% # 按"very low"占比从高到低排序Factor,转为有序因子 mutate(Factor = fct_reorder(Factor, -percent[Level == "very low"])) %>% # 固定Level的顺序为very low -> very high mutate(Level = fct_relevel(Level, "very low", "low", "high", "very high"))
2. 绘制100%水平堆叠条形图
基于预处理后的数据,用ggplot2生成符合要求的图表:
# 自定义各评分等级的颜色,可按需修改 level_colors <- c( "very low" = "#d73027", "low" = "#fc8d59", "high" = "#91cf60", "very high" = "#1a9850" ) work_culture_fig <- ggplot(work_culture_summary, aes(y = Factor, x = percent, fill = Level)) + # 绘制水平堆叠条形 geom_col(position = "stack", width = 0.8) + # 添加每个分段的响应计数标签,居中显示 geom_text(aes(label = n), position = position_stack(vjust = 0.5), size = 3.5) + # 应用自定义颜色 scale_fill_manual(values = level_colors) + # 横轴仅显示0%、50%、100%刻度 scale_x_continuous(limits = c(0, 100), breaks = c(0, 50, 100), labels = c("0%", "50%", "100%")) + # 设置图表标签 labs( x = "受访者占比", y = "职场文化因素", fill = "评分等级", title = "职场文化因素感受评分分布" ) + # 优化主题样式(可选) theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), legend.position = "bottom" ) print(work_culture_fig)
核心要点说明
- 无需转宽表:长格式数据更适配
ggplot2的分组统计逻辑,通过count()和mutate()即可完成占比计算。 - 原代码问题:你之前的代码错误将
x映射到Level,导致横轴为评分等级而非占比,无法生成堆叠占比图。 - 排序实现:通过
fct_reorder()以每个Factor下"very low"的占比倒序排列,实现条形从上到下按要求排序。 - 计数标签:
position_stack(vjust=0.5)确保标签在每个分段居中显示。
内容的提问来源于stack exchange,提问作者hpy
相关产品推荐
相关产品推荐

