You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:17:23