geom_histogram生成的直方图不符合理论预期,求问题排查与解决
解决ggplot2直方图与频率分布表不符的问题
你现在遇到的问题是用ggplot2绘制的直方图和你的频率分布表结果对不上,咱们一步步来排查和解决这个问题:
核心问题分析
你的代码里同时设置了bins=11和binwidth=5,这两个参数是互斥的——ggplot2会优先用binwidth,但自动分箱的起始点可能和你频率分布表的组区间(比如[45,50)、[50,55)这类)不匹配,导致频数统计和预期不符。
具体解决方案
1. 手动指定分箱边界,完全匹配频率分布表
直接用breaks参数定义和你频率分布表完全一致的组区间,这样分箱逻辑就和理论结果完全对齐了:
# 生成和频率分布表一致的分箱边界:从45到100,步长5 bin_breaks <- seq(45, 100, by = 5) ggplot(Book2, aes(x = weight)) + # 用breaks指定分箱边界,同时设置填充色和边框让图更清晰 geom_histogram(breaks = bin_breaks, fill = "#69b3a2", color = "white") + scale_x_continuous(breaks = bin_breaks, limits = c(45, 100)) + scale_y_continuous(breaks = seq(0, 30, by = 5), limits = c(0, 30)) + theme_classic()
2. 先验证数据的频数统计
在绘图前,你可以先跑一行代码验证数据的频数是否和频率分布表一致,确认不是数据读取的问题:
# 按指定边界统计每组频数,include.lowest确保第一个区间包含左端点 table(cut(Book2$weight, breaks = bin_breaks, include.lowest = TRUE))
如果这个输出和你的频率分布表一致,那绘图后结果肯定能对上;如果不一致,那就要检查Book2数据的读取是否正确,有没有遗漏或错误的数据。
3. 去掉冲突的分箱参数
记得不要再同时用bins和binwidth,这会让ggplot2的分箱逻辑混乱,只保留breaks来手动控制分箱就好。
内容的提问来源于stack exchange,提问作者Roohul Amin
相关产品推荐
相关产品推荐

