ggplot直方图首bin宽度异常,如何设置1-2、2-3等标准区间?
解决ggplot直方图区间对齐问题
要让直方图的区间严格按照1-2、2-3、3-4...划分,核心是通过boundary参数指定区间的起始边界为1,配合binwidth=1使用即可实现。
默认情况下,ggplot会自动选择区间的起始位置(通常围绕0对齐),这就导致你的直方图出现了1.0-1.5、1.5-2.5这类不符合预期的区间划分。设置boundary=1可以强制区间边界对齐到整数1,结合binwidth=1就能得到你想要的1-2、2-3等区间。
修改后的完整代码如下:
library(ggplot2) library(scales) # 定义数据 data <- data.frame (id= 1:141, time = c(1.328767,33.909589,13.230137,32.331507,6.161644,20.167123,15.794521, 35.750685,3.958904,2.347945,1.756164,3.794521,46.961644,5.668493,14.775342,5.964384,15.268493,17.241096, 4.452055,17.372603,4.123288,28.945205,1.394521,9.515068,1.690411,5.734247,1.065753,5.405479,1.131507,8.39720,1.131507,1.065753,2.084932,13.460274,1.164384,6.786301,39.301370,1.197260,1.263014,1.098630,2.117808,1.230137,1.657534,1.065753,1.131507,13.986301,1.690411,1.065753,1.197260,2.249315,10.665753,1.690411,5.405479,4.452055,1.098630,1.065753,1.197260,1.065753,1.164384,1.493151,1.789041,1.394521,1.263014,17.701370,6.720548,24.605479,1.328767,13.197260,1.065753,4.189041,2.446575,30.852055,19.016438,28.813699,16.715068,29.438356,1.065753,1.230137,7.871233,4.386301,22.698630,1.295890,14.643836,1.131507,13.000000,3.991781,3.400000,17.964384,1.065753,2.512329,1.065753,3.827397,5.800000,21.745205,17.339726,1.164384,11.619178,9.515068,2.282192,4.189041,1.098630,1.065753,19.509589,25.591781,1.230137,28.747945,8.726027,1.065753,11.487671,30.720548,8.232877,19.871233,3.728767,1.986301,10.534247,8.956164,11.356164,11.520548,1.361644,4.484932,15.531507,1.493151,27.432877,10.468493,6.589041,1.065753,1.263014,1.065753,1.098630,35.421918,1.295890,9.810959,1.098630,21.547945,1.657534, 1.394521,1.065753,11.652055,1.164384,1.887671,1.098630)) # 绘制直方图 ggplot(data = data, aes(x = time)) + # 指定区间宽度为1,边界对齐到1 geom_histogram(aes(y = after_stat(count)/sum(after_stat(count))), binwidth=1, boundary=1, fill="#ED0000B2",color="#FFFFFF") + # 设置y轴为百分比格式,调整上限以显示40.4%的占比 scale_y_continuous(breaks=seq(from=0,to=0.45,by=0.05), expand=c(0,0), labels=scales::percent, limits=c(0, 0.45)) + # 设置x轴刻度为3个月间隔 scale_x_continuous(breaks=seq(from=0,to=max(data$time),by=3), expand=c(0,0)) + labs(title = '事件发生时间', caption=paste0("N=",n_distinct(data$id)), x = '启动后月数', y = '(%)') + # 设置字体为Times New Roman theme(text=element_text(size=12, family="Times New Roman"), plot.title = element_text(hjust = 0.5,face="bold"), plot.subtitle = element_text(hjust=0.5), panel.background = element_rect(fill="#FFFFFF"), axis.line = element_line(size = 0.2, colour = "#000000", linetype=1))
关键说明
boundary=1:强制所有区间的边界对齐到整数1,第一个区间即为[1,2),包含所有1.0到2.0之间的样本(共57个,占比40.4%),后续区间依次为[2,3)、[3,4)等。- 调整y轴上限到0.45,确保40.4%的柱形能完整显示(原代码y轴上限0.35会截断该柱形)。
内容的提问来源于stack exchange,提问作者anaurosevic
相关产品推荐
相关产品推荐

