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

如何使用ggplot2基于两个二值列绘制可变宽百分比堆叠条形图

实现可变宽度百分比堆叠条形图的方案

原代码问题说明

你原有代码的核心问题是y参数映射了分类变量dairyFree,而geom_col要求y轴映射数值型的统计值,因此无法生成正确的堆叠高度。

实现思路

仅用ggplot2搭配R内置基础函数即可实现需求,无需加载其他第三方包:

  1. 先用R内置的table函数汇总两个二值变量的交叉频数、每个veryHealthy分组的总样本量,计算每个交叉分组的占比
  2. 绘图时将柱子宽度映射为分组总样本量,即可实现厚度随实例数变化的效果

完整可运行代码

# 汇总统计数据(使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:04