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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:22:49