R ggplot2基于频率表绘制多状态分组直方图的实现方法
分箱频数表绘制分组直方图实现方案
你的原始数据是典型的宽格式预聚合频数表:每一行对应一个分箱参考值,不同状态的计数单独存为一列,这种结构无法直接适配ggplot2的分组绘图要求,需要先转换为长格式,再绘图即可。
第一步:转换为适配绘图的长表结构
ggplot2分组几何对象要求输入数据满足:每一行对应一个「分箱参考值+状态类型+计数」的唯一组合,也就是长表结构。
转换方法1:tidyr 快速转换(推荐)
# 加载依赖包 library(tidyr) library(ggplot2) df_long <- df_1 |> pivot_longer( cols = starts_with("status"), # 选中所有存储状态计数的列 names_to = "status_type", # 新列:存储状态类别(status1/2/3) values_to = "count" # 新列:存储对应类别的出现次数 )
转换后的前6行数据结构如下,完全满足绘图要求:
ref status_type count
5 status1 8341
5 status2 0
5 status3 0
10 status1 3045
10 status2 537
10 status3 0
转换方法2:基础R转换(无需安装额外包)
df_long_base <- data.frame( ref = rep(df_1$ref, each = 3), status_type = rep(c("status1", "status2", "status3"), times = nrow(df_1)), count = c(df_1$status1, df_1$status2, df_1$status3) )
第二步:绘制分组直方图
注意:你已经提前完成分箱和频数统计,不需要使用
geom_histogram()(该函数用于对原始未聚合数据自动分箱算频数),直接用geom_col()绘制柱状图即可。
两种常用展示效果可选:
效果1:同参考值位置并列展示三类计数(完全匹配需求)
设置柱状图为并列排布模式,同一x轴参考值位置并排展示3类状态的计数:
ggplot(df_long, aes(x = factor(ref), y = count, fill = status_type)) + geom_col(position = position_dodge(width = 0.8), width = 0.7) + labs( x = "分箱参考值", y = "出现次数", fill = "状态类型", title = "各分箱下不同状态的观测数分布" ) + theme_bw() + # x轴标签旋转45度,避免文字重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
- 代码里用
factor(ref)把参考值转为离散分类变量,避免ggplot把参考值识别为连续数值,出现数据中不存在的中间刻度。
效果2:同参考值位置堆叠展示计数
如果需要同时看每个分箱的总观测数和内部构成,可以用堆叠模式:
ggplot(df_long, aes(x = factor(ref), y = count, fill = status_type)) + geom_col(position = "stack", width = 0.7) + labs( x = "分箱参考值", y = "出现次数", fill = "状态类型", title = "各分箱下不同状态的观测数堆叠分布" ) + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
内容的提问来源于stack exchange,提问作者trailblazer_1
相关产品推荐
相关产品推荐

