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

