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

如何用R语言ggplot2基于分组二元数据集创建堆叠条形图?

解决方案

先明确示例中points的含义

示例里的points是每个(X轴类别+堆叠类别)组合的汇总计数——对应你需要的「每个分组下,工作状态为「是」的人数、「否」的人数」。你的0/1原始数据需要先汇总出这个计数,才能对应示例中的points字段。

步骤1:将数据转换为ggplot所需格式

你的数据是宽格式(每列对应一个分组),必须转成长格式(三列:分组、工作状态、计数),分两种场景处理:

场景1:数据已完成汇总(每一行是「是/否」,单元格为对应分组的人数)

如果原始数据结构是这样:

Variable1 Group1a Group1b Group2a ... Group9
yes       0       2       5       ... 1
no        1       3       4       ... 2

用tidyr和dplyr转换格式:

library(tidyr)
library(dplyr)

# 转长格式并重命名列
long_data <- raw_data %>%
  pivot_longer(cols = -Variable1,  # 排除工作状态列,其余列转成长格式
               names_to = "分组",
               values_to = "计数") %>%
  rename(工作状态 = Variable1)  # 重命名让列名更直观

场景2:数据为原始样本数据(每一行代表一个受访者,Group列的0/1表示是否属于该分组)

如果每一行是一个受访者,Variable1是其工作状态,Group列的1表示属于该分组、0表示不属于:

library(dplyr)
library(tidyr)

# 转长格式并筛选出受访者所属的分组
sample_long <- sample_data %>%
  pivot_longer(cols = starts_with("Group"),
               names_to = "分组",
               values_to = "是否属于") %>%
  filter(是否属于 == 1)  # 只保留受访者实际所属的分组

# 统计每个分组下不同工作状态的人数
count_data <- sample_long %>%
  group_by(分组, Variable1) %>%
  summarise(计数 = n(), .groups = "drop") %>%
  rename(工作状态 = Variable1)

步骤2:绘制堆叠条形图

用ggplot2绘图,参数对应关系:

  • x=分组 → 示例的x=team
  • fill=工作状态 → 示例的fill=position
  • y=计数 → 示例的y=points

代码:

library(ggplot2)

ggplot(count_data, aes(x = 分组, y = 计数, fill = 工作状态)) +
  geom_bar(position = "stack", stat = "identity") +
  # 可选:给X轴分组添加中文标签,提升可读性
  scale_x_discrete(labels = c("Group1a" = "有休闲时间+父母支持",
                              "Group1b" = "有休闲时间+无父母支持",
                              # 依次补充剩余7个分组的标签
                              "Group9" = "XXX")) +
  labs(title = "工作状态与休闲时间、父母经济支持的关联",
       x = "分组",
       y = "人数",
       fill = "是否工作") +
  theme_minimal()

内容的提问来源于stack exchange,提问作者Jules

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 00:14:53