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

R中scale_x_binned()空最后分箱及right选项逻辑反常问题

问题解决:scale_x_binned分箱异常及最后分箱消失的处理

问题原因分析

  • 设置right=TRUE时,分箱采用左开右闭区间(例如(16,18]),因此数值18会被归入16-18分箱,导致该分箱计数为4(包含3个17和1个18),与预期的“18归入18-20分箱”不符。
  • 设置right=FALSE时,分箱采用左闭右开区间(例如[16,18)),逻辑符合预期,但默认分箱的右边界等于数据最大值29,导致最后一个分箱为[28,29),而数值29不在该区间内,因此对应分箱无数据、显示为空。

解决方案

需要手动控制分箱边界,确保最大值29被包含到最后一个分箱中,以下两种方法均可实现:

方法一:自定义分箱断点

直接指定覆盖到大于最大值的断点,确保29能落入最后一个左闭右开区间:

rm(list=ls())
library(ggplot2)
library(Hmisc, warn.conflicts = FALSE)

Time = c(17, 14, 21, 19, 18, 24, 25, 14, 17, 19, 20, 17, 21, 20, 23, 27, 25, 25, 27, 29, 24, 22, 26, 29)
data = data.frame(Time)

ggplot(data, aes(x = Time))+
  geom_bar()+
  scale_x_binned(right = FALSE, show.limits = TRUE, breaks = seq(14, 30, by = 2))

此代码生成的分箱为[14,16)、[16,18)...[28,30),29会被归入28-30分箱,计数正确,且刻度位于柱子之间。

方法二:扩展x轴范围

通过limits参数将x轴上限扩展至最大值+分箱宽度,让最后一个分箱能包含最大值:

rm(list=ls())
library(ggplot2)
library(Hmisc, warn.conflicts = FALSE)

Time = c(17, 14, 21, 19, 18, 24, 25, 14, 17, 19, 20, 17, 21, 20, 23, 27, 25, 25, 27, 29, 24, 22, 26, 29)
data = data.frame(Time)
bin_width <- 2 # 指定分箱宽度

ggplot(data, aes(x = Time))+
  geom_bar()+
  scale_x_binned(right = FALSE, show.limits = TRUE, 
                 binwidth = bin_width,
                 limits = c(min(Time), max(Time) + bin_width))

此方法无需手动罗列所有断点,适合数据范围变动的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:55:13