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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:03:26