在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
相关产品推荐
相关产品推荐

