如何用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=teamfill=工作状态→ 示例的fill=positiony=计数→ 示例的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
相关产品推荐
相关产品推荐

