R绘制直方图报错'breaks' do not span range of x解决及x轴设置
问题解答
两种分箱方案的合理性对比
优先选择第二种方案:将分箱上限在最大值基础上加0.4覆盖全部数据,比调整分箱数的方案更符合需求,原因如下:
- 直接设置
length(seq(3.4, 6.31, 0.4)) + 1作为分箱数的方案,R的hist()函数会自动根据数据范围和分箱数计算等宽分箱,最终生成的分箱起始值、步长大概率会偏离你要求的3.4起始、0.4步长的设定,完全不符合你的原始需求。 - 手动指定分箱边界的方案可以严格控制分箱规则,你只需要把seq的上限调整为6.6即可,生成的分箱序列为
seq(3.4, 6.6, 0.4),完全符合步长要求,也能覆盖所有数据。
两种方案对结果准确性的影响
- 调整分箱数的方案:分箱起始值和步长不可控,统计出的各分箱频数和你预期的规则下的结果会存在偏差,属于不符合需求的不准确。
- 扩展分箱上限的方案:仅多了一个[6.2, 6.6]的分箱,原始数据的频数统计完全符合你设定的3.4起始、0.4步长的规则,不会导致结果不准确,仅会在最右侧出现一个频数为0的分箱,不影响有效数据的分布展示。
第二种方案下x轴刻度的设置方法
绘制直方图时先关闭默认x轴,再手动用axis()函数设置刻度为分箱边界即可,参考代码如下:
# 加载内置数据集 data(PlantGrowth) # 生成符合要求的分箱边界 my_breaks <- seq(3.4, 6.6, 0.4) # 绘制直方图,关闭默认x轴 hist(PlantGrowth$weight, breaks = my_breaks, xaxt = "n", xlab = "植物重量", main = "PlantGrowth数据集重量分布直方图") # 手动设置x轴刻度为分箱边界 axis(side = 1, at = my_breaks)
如果不想展示最右侧的6.6刻度,也可以将axis的at参数指定为my_breaks[-length(my_breaks)],仅展示到6.2即可,不会影响分箱的统计逻辑。
内容的提问来源于stack exchange,提问作者cxspv2108
相关产品推荐
相关产品推荐

