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

如何在R中基于区间分组频次表数据绘制直方图

R语言基于分组频次表绘制直方图的实操步骤

你提供的是不等距分组的频次数据(最后一组组距为300,其余组距为100),可以参考以下两种常用实现方式:


方法1:基础R内置函数实现

第一步:定义分组数据

首先把分组断点和对应频数存为向量:

# 分组区间的端点
breaks <- c(0, 100, 200, 300, 400, 500, 800)
# 对应区间的灯泡数量
freq <- c(82, 71, 68, 56, 43, 15)

第二步:绘制直方图

直接构造histogram类对象绘图,自动适配不等距分组:

# 构造直方图对象
hist_data <- structure(
  list(
    breaks = breaks,
    counts = freq,
    density = freq / diff(breaks),
    mids = (head(breaks, -1) + tail(breaks, -1)) / 2,
    xname = "灯泡工作时长(小时)",
    equidist = FALSE
  ),
  class = "histogram"
)

# 出图
plot(
  hist_data,
  col = "skyblue",
  main = "灯泡工作时长分布直方图",
  xlab = "工作时长(小时)",
  ylab = "频数密度"
)

如果不需要遵循不等距直方图的统计规范,只想用原始频数作为Y轴,也可以用barplot实现:

barplot(
  freq,
  width = diff(breaks),
  space = 0,
  col = "skyblue",
  xlab = "工作时长(小时)",
  ylab = "灯泡数量",
  main = "灯泡工作时长分布直方图"
)
axis(1, at = cumsum(diff(breaks)), labels = tail(breaks, -1))

方法2:ggplot2包实现(样式更灵活)

第一步:构造绘图数据框

library(ggplot2)

# 生成数据框
df <- data.frame(
  start = head(breaks, -1),
  end = tail(breaks, -1),
  freq = freq,
  group_width = diff(breaks)
)

第二步:绘制直方图

ggplot(df) +
  # 用geom_col绘制,width参数匹配组距,保证柱间无间隔
  geom_col(
    aes(x = (start + end)/2, y = freq, width = group_width),
    fill = "skyblue",
    color = "black"
  ) +
  # 自定义坐标轴和标题
  labs(
    x = "灯泡工作时长(小时)",
    y = "灯泡数量",
    title = "灯泡工作时长分布直方图"
  ) +
  # X轴显示分组断点
  scale_x_continuous(breaks = breaks) +
  theme_classic()

如果要绘制符合统计规范的不等距直方图,只需要把aes里的y = freq改成y = freq/group_width,Y轴标签换成“频数密度”即可。


小提示:不等距分组的场景下,用频数密度作为Y轴时,每个柱子的面积对应该组的频数大小,不会因为组距差异导致分布展示出现误导,更符合直方图的定义要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:48:03