如何用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工具链可一次性完成数据重塑、统计和绘图,无需逐个创建数据框:
- 加载依赖包
library(tidyverse)
- 数据重塑与占比统计
将宽格式的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即可。
- 绘制分组柱状图
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
相关产品推荐
相关产品推荐

