R-ggplot2技术问询:基于双因子拆分单因子的计数条形图绘制
嘿,刚好我之前折腾过类似的ggplot2条形图需求,这就给你一步步讲清楚怎么实现你要的效果!
核心思路
你需要的是分组并排+内部堆叠的计数条形图:每个item作为x轴类别,每个item下对应group=0和group=1两个并排条形,而每个条形内部又按response_cat(0/1)堆叠展示不同响应的计数。用ggplot2的geom_bar配合合适的位置参数就能轻松搞定。
具体代码实现
首先咱们先模拟一份和你变量匹配的测试数据,方便你直接跑通代码:
# 加载必要包 library(tidyverse) # 模拟测试数据(和你的变量结构完全匹配) set.seed(123) # 设置随机种子保证结果可复现 test_data <- tibble( item = sample(c("LY1", "GN6", paste0("ITEM", 1:18)), 500, replace = TRUE), group = sample(c(0, 1), 500, replace = TRUE), response_cat = sample(c(0, 1), 500, replace = TRUE, prob = c(0.6, 0.4)) ) %>% # 把分类变量转成因子,让ggplot处理更友好 mutate( group = factor(group, labels = c("Group 0", "Group 1")), response_cat = factor(response_cat, labels = c("No Response", "Response")) )
接下来是核心绘图代码,关键参数都加了注释:
ggplot(test_data, aes(x = item, fill = response_cat)) + # 绘制分组并排+内部堆叠的条形图 geom_bar(aes(group = group), position = position_dodge(width = 0.8), # 控制同item下两个group条形的间距 stat = "count") + # 统计每个组合的观测数,正好对应你要的计数分布 # 自定义填充色(可选,按需调整) scale_fill_brewer(palette = "Set2") + # 调整x轴标签,避免20个item的标签重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # 添加清晰的标题和轴标签 labs( x = "Item Code", y = "Count", fill = "Response Category", title = "Response Distribution by Item and Group", subtitle = "Each item has two bars (Group 0/1), stacked by response status" )
关键参数解释
aes(x = item, fill = response_cat):指定x轴为item,用response_cat的不同取值填充颜色(对应条形内部的堆叠部分)。aes(group = group):告诉ggplot要按group拆分每个item下的条形,实现同item内两个分组并排的效果。position = position_dodge(width = 0.8):控制同item下两个group条形的并排间距,数值越大间距越宽,可根据视觉效果调整。stat = "count":默认统计每个组合的观测数,完全符合你要展示计数分布的需求。
额外优化建议
因为你有20个item,可以再加两个小优化让图表更易读:
- 把
item按总计数排序:
# 按item的总观测数从少到多排序 test_data <- test_data %>% mutate(item = fct_reorder(item, item, .fun = length))
- 如果x轴标签还是挤,换成横向条形图:
# 在绘图代码末尾加上这一行即可 coord_flip()
内容的提问来源于stack exchange,提问作者Petr Palášek
相关产品推荐
相关产品推荐

