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

在R中使用ggplot2绘制带分类变量占比的堆叠直方图

搞定基于计数变量的相对占比堆叠直方图

嘿,我来帮你把这个堆叠直方图完美实现!你的前期代码框架已经搭好了,只需要补全数据处理和绘图的最后几步就行,咱们一步步来:

1. 补全数据转换步骤

你已经用melt来转长格式,但id参数没写完,这里应该指定"count"作为分组的id变量,这样转换后的数据才能被ggplot正确识别:

library(reshape)
library(ggplot2)

# 你的原始数据生成代码
values= replicate(4, diff(c(0, sort(runif(92)), 1)))
colnames(values) = c("A","B","C","D")
counts = sample(1:100, 93, replace=T)
df = data.frame(cbind(values,"count"=counts))

# 补全melt步骤,转成长格式
mdf = melt(df, id = "count")

转成mdf后,数据会变成三列:count(你的计数变量)、variable(分类变量A-D)、value(对应的相对占比,每行总和为1)。

2. 绘制相对占比堆叠直方图

核心是用geom_col加上position="fill"参数,这个参数会让每个count对应的堆叠条形总高度固定为1,完美展示各分类的相对占比:

ggplot(mdf, aes(x = count, y = value, fill = variable)) +
  geom_col(position = "fill") +
  # 美化一下坐标轴和标签
  labs(
    x = "计数变量",
    y = "相对占比",
    fill = "分类变量",
    title = "基于计数变量的分类相对占比堆叠直方图"
  ) +
  scale_y_continuous(labels = scales::percent) + # 把y轴转成百分比显示
  theme_minimal() # 用简洁的主题

关键参数解释

  • position="fill":这是实现“每个条形总和为1”的核心,它会将每个x分组下的所有y值按比例缩放,让总高度为1。
  • scale_y_continuous(labels = scales::percent):把y轴的小数转换成百分比,更直观展示占比。
  • 长格式数据mdf:ggplot要求数据是长格式,melt就是帮我们把宽格式的A-D列转成分类列,方便映射颜色和堆叠。

这样你就能得到每个条形高度都是1,每个分段对应A-D相对占比的堆叠直方图啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:13