如何用ggplot在R中绘制两列分类变量的分组计数条形图?
解决ggplot分组计数条形图问题
问题分析
你之前的代码存在几个关键问题:
- 数据框名称不匹配:转换后的长格式数据是
df_long,但绘图时误用了preg_long - 映射逻辑错误:将
y轴设为factor(value),但geom_col需要数值型的计数数据,而非分类值 - 未过滤NA值:原始数据中的NA会干扰Yes/No的计数统计
- 分组映射错误:要实现同组内Yes/No条形并列,需将
fill映射为value而非name
修正后的代码方案
方案1:使用geom_bar自动统计计数
先转换长格式并过滤NA,再直接用geom_bar完成计数和绘图:
library(tidyr) library(ggplot2) # 转换为长格式并过滤NA值 df_long <- tidyr::pivot_longer(df, cols = -subject_id) %>% dplyr::filter(!is.na(value)) # 绘制分组条形图 ggplot(df_long, aes(x = name, fill = value)) + geom_bar(position = position_dodge(width = 0.8), width = 0.7, color = "black") + labs( x = "计划类型", y = "计数", fill = "选项", title = "plan_preg与plan_wanted的Yes/No计数" ) + theme_minimal()
方案2:先统计计数再用geom_col
如果需要更清晰的统计结果,可以先计算每个分组的数量,再绘图:
library(tidyr) library(dplyr) library(ggplot2) # 转换长格式、过滤NA并统计计数 df_summary <- tidyr::pivot_longer(df, cols = -subject_id) %>% dplyr::filter(!is.na(value)) %>% dplyr::count(name, value) # 绘制条形图 ggplot(df_summary, aes(x = name, y = n, fill = value)) + geom_col(position = position_dodge(width = 0.8), width = 0.7, color = "black") + labs( x = "计划类型", y = "计数", fill = "选项", title = "plan_preg与plan_wanted的Yes/No计数" ) + theme_minimal()
效果说明
两种方案都会生成:
- x轴为
plan_preg和plan_wanted两个独立分组 - 每个分组下并列显示Yes和No的计数条形
- 黑色边框区分条形,填充色区分Yes/No选项
内容的提问来源于stack exchange,提问作者Thandi
相关产品推荐
相关产品推荐

