You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在R语言中绘制分组堆叠条形图?

Hey David, 这就帮你搞定这个分组堆叠条形图!咱们用ggplot2来实现,不过首先得把你的宽格式数据转成长格式,这样ggplot能更顺畅地处理多问题的分组展示。

步骤1:加载必要的包

首先咱们需要tidyverse(包含数据处理工具dplyr和绘图工具ggplot2):

library(tidyverse)

步骤2:转换数据格式

你的原始数据是宽格式(每个问题单独一列),咱们把它转成长格式,让ggplot能统一识别问题和对应的回答:

# 将q1-q4列转换为"问题名称"和"回答值"两列
df_long <- df %>%
  pivot_longer(
    cols = starts_with("q"),  # 选中所有以q开头的列
    names_to = "question",    # 新列存储问题名称(q1/q2/q3/q4)
    values_to = "response"    # 新列存储对应的回答等级(1-5)
  )

步骤3:绘制分组堆叠条形图

现在可以开始绘图了,目标是每个问题(x轴)下,分别展示pre和post的堆叠条形(按回答等级堆叠):

ggplot(df_long, aes(x = question, fill = response)) +
  # 按pre_post分组,让每个问题的pre/post条形并排,同时堆叠回答等级
  geom_bar(aes(group = pre_post), position = position_dodge(width = 0.9)) +
  # 可选:用调色板让颜色更美观协调
  scale_fill_brewer(palette = "Set2") +
  # 添加清晰的图表标签
  labs(
    title = "前后测各问题回答分布对比",
    x = "问题编号",
    y = "人数",
    fill = "回答等级"
  ) +
  # 用简洁的主题,也可以换成theme_minimal()等其他风格
  theme_bw()

代码小解释

  • pivot_longer:转格式是关键操作,把分散在多列的问题数据整合到同一列,方便ggplot批量处理。
  • geom_bar里的group = pre_post:告诉ggplot要按pre_post分组,让每个问题对应的pre和post条形并排展示;position_dodge(width = 0.9)控制并排条形的宽度,避免互相重叠。
  • fill = response:让堆叠的部分按回答等级区分颜色,直观展示每个等级的分布情况。

如果你想展示百分比而非绝对频数,只需修改geom_bar的参数,让每个分组内的比例堆叠:

ggplot(df_long, aes(x = question, fill = response)) +
  geom_bar(
    aes(group = interaction(question, pre_post), y = ..prop..),
    position = position_dodge(width = 0.9),
    stat = "count"
  ) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_brewer(palette = "Set2") +
  labs(title = "前后测各问题回答占比对比", y = "百分比") +
  theme_bw()

这样就能得到你想要的分组堆叠条形图啦!

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

火山引擎 最新活动