如何使用ggplot2基于两个二值列绘制可变宽百分比堆叠条形图
实现可变宽度百分比堆叠条形图的方案
原代码问题说明
你原有代码的核心问题是y参数映射了分类变量dairyFree,而geom_col要求y轴映射数值型的统计值,因此无法生成正确的堆叠高度。
实现思路
仅用ggplot2搭配R内置基础函数即可实现需求,无需加载其他第三方包:
- 先用R内置的
table函数汇总两个二值变量的交叉频数、每个veryHealthy分组的总样本量,计算每个交叉分组的占比 - 绘图时将柱子宽度映射为分组总样本量,即可实现厚度随实例数变化的效果
完整可运行代码
# 汇总统计数据(使用R内置基础函数,无额外依赖) # 汇总veryHealthy与dairyFree的交叉频数 cross_count <- as.data.frame(table(foods$veryHealthy, foods$dairyFree), responseName = "group_n") colnames(cross_count) <- c("veryHealthy", "dairyFree", "group_n") # 汇总每个veryHealthy分类的总样本量 total_count <- as.data.frame(table(foods$veryHealthy), responseName = "total_n") colnames(total_count) <- c("veryHealthy", "total_n") # 合并数据并计算各交叉组占比 plot_data <- merge(cross_count, total_count, by = "veryHealthy") plot_data$percent <- plot_data$group_n / plot_data$total_n # 加载ggplot2绘图 library(ggplot2) ggplot(plot_data, aes(x = veryHealthy, y = percent, fill = dairyFree, width = total_n)) + geom_col(position = "stack", colour = "white") + # 白边区分堆叠区块 scale_y_continuous(labels = function(x) paste0(x * 100, "%")) + # Y轴显示百分比格式 labs(x = "veryHealthy分类", y = "占比", fill = "dairyFree") + theme_classic()
关键参数说明
width = total_n:将柱子宽度映射到每个veryHealthy分组的总样本量,样本量越大柱子越宽position = "stack":因为提前计算了各分组占比,堆叠后总高度刚好为100%,实现百分比堆叠效果- 全程仅加载ggplot2,未使用其他第三方扩展包,符合要求
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

