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

如何用ggplot优雅绘制按哑变量分组的1值占比柱状图?

用ggplot高效绘制分组占比柱状图(R语言实现)

修正原数据代码的小问题

原代码中df1 <- data.frame(lapply(df1, factor))存在未定义df1的问题,应改为处理原始数据集df:

df <- data.frame(A=c(1,2,2,3,4,5,1,1,2,3),
                B=c(4,4,2,3,4,2,1,5,2,2),
                C=c(3,3,3,3,4,2,5,1,2,3),
                D=c(1,2,5,5,5,4,5,5,2,3),
                E=c(1,4,2,3,4,2,5,1,2,3),
                dummy1=c("yes","yes","no","no","no","no","yes","no","yes","yes"),
                dummy2=c("high","low","low","low","high","high","high","low","low","high"))

# 将所有列转为因子(可选,若不需要因子类型可跳过)
df <- data.frame(lapply(df, factor))

高效数据整理与绘图流程

使用tidyverse工具链可一次性完成数据重塑、统计和绘图,无需逐个创建数据框:

  1. 加载依赖包
library(tidyverse)
  1. 数据重塑与占比统计
    将宽格式的A-E列转为长格式,按目标哑变量(以下以dummy1为例,可替换为dummy2)分组,统计每列中值为1的占比:
plot_data <- df %>%
  # 保留哑变量,将A-E列转为长格式
  pivot_longer(cols = A:E, names_to = "variable", values_to = "value") %>%
  # 按数据列和哑变量分组
  group_by(variable, dummy1) %>%
  # 计算1的占比:等于1的行数/分组总行数
  summarise(prop_1 = mean(value == "1"), .groups = "drop")
  • 若A-E列为数值型而非因子,将value == "1"改为value == 1即可。
  1. 绘制分组柱状图
ggplot(plot_data, aes(x = variable, y = prop_1, fill = dummy1)) +
  # 并列分组柱状图,调整柱子间距
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  # Y轴转为百分比格式
  scale_y_continuous(labels = scales::percent_format()) +
  # 添加百分比标签,避免柱子遮挡
  geom_text(aes(label = scales::percent(prop_1)), 
            position = position_dodge(width = 0.8), 
            vjust = -0.5, size = 3.5) +
  # 设置图表标题与标签
  labs(x = "数据列", y = "值为1的占比", fill = "哑变量分组",
       title = "各数据列中1的占比(按dummy1分组)") +
  # 优化主题样式(可选)
  theme_minimal()

切换哑变量分组的方法

若要按dummy2分组,只需将代码中的dummy1替换为dummy2:

plot_data <- df %>%
  pivot_longer(cols = A:E, names_to = "variable", values_to = "value") %>%
  group_by(variable, dummy2) %>%
  summarise(prop_1 = mean(value == "1"), .groups = "drop")

ggplot(plot_data, aes(x = variable, y = prop_1, fill = dummy2)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  scale_y_continuous(labels = scales::percent_format()) +
  geom_text(aes(label = scales::percent(prop_1)), 
            position = position_dodge(width = 0.8), 
            vjust = -0.5, size = 3.5) +
  labs(x = "数据列", y = "值为1的占比", fill = "哑变量分组",
       title = "各数据列中1的占比(按dummy2分组)") +
  theme_minimal()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:09:10