R语言:为数据框添加分组总计行并实现facet_grid可视化
解决数据框分组统计与ggplot2分面总计展示问题
需求说明
需要将数据框转换为长格式,添加分组计数、百分比;为每个am分组添加总计行;最终通过ggplot2的facet_grid实现三个分面(vs=0、vs=1、总计)——因为原生margins=TRUE无法与geom_text兼容,现有代码仅实现了基础计数和百分比,缺少am分组的总计行。
解决方案
1. 生成包含总计行的统计数据框
通过dplyr分别计算原有分组统计和am分组的总计,再合并数据框,同时标记总计行的vs类别:
library(dplyr) library(ggplot2) library(formattable) # 计算am与vs交叉分组的计数和百分比 df_grouped <- mtcars %>% group_by(am, vs) %>% summarise(cnt = n(), .groups = "drop") %>% mutate(freq = percent(cnt / sum(cnt), digits = 1)) # 计算每个am分组的总计行 df_total <- mtcars %>% group_by(am) %>% summarise(cnt = n(), .groups = "drop") %>% mutate(vs = "总计", # 标记总计分面 freq = percent(1, digits = 1)) # 总计百分比为100% # 合并数据并指定分面顺序 df_plot <- bind_rows(df_grouped, df_total) %>% mutate(vs = factor(vs, levels = c(0, 1, "总计")))
2. 调整绘图代码实现分面展示
修改facet_grid使用包含"总计"的vs列,确保geom_text正常显示:
ggplot(df_plot, aes(x = as.factor(am), y = cnt, fill = as.factor(am))) + geom_bar(stat = "identity", position = position_dodge(width = 0.9)) + geom_text(aes(label = paste(cnt, paste0('\n(', freq, ')'))), vjust = -0.1, position = position_dodge(width = 0.9)) + facet_grid(cols = vars(vs)) + labs(x = "am", y = "计数", fill = "am") + theme_bw()
内容的提问来源于stack exchange,提问作者Schillerlocke
相关产品推荐
相关产品推荐

