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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:21:42