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

