stat_bin位置异常:直方图百分比标签无法正确对齐
问题解决:直方图标签精准对齐柱子顶端
核心问题
你代码里的标签y轴用了占比(count/sum(count)),但主y轴是实际计数(0-45),两者尺度完全不匹配——占比数值在0-1之间,映射到计数轴上自然会靠近底部;前两个柱子占比高,数值略大,位置就显得比其他柱子的标签高,本质是尺度错位导致的。
修改后的代码
# 统一定义分组区间,避免重复编写 bin_breaks <- seq(0, 30, by = 3.5) ggplot(bbdd, aes(t_fluoro)) + geom_histogram(breaks = bin_breaks, fill="#99ccff") + scale_x_continuous(breaks=bin_breaks, limits=c(0,24.5), expand=c(0,0)) + scale_y_continuous(limits=c(0,45), expand=c(0,0)) + stat_bin(breaks = bin_breaks, geom = "text", color = "#333366", # 关键:y用实际计数,和柱子顶端对齐;标签仍计算占比 aes(y = after_stat(count), label = scales::percent(after_stat(count / sum(count)))), # 调整vjust让标签在柱子顶端上方,避免重叠 vjust = -0.2) + coord_fixed(ratio=0.6) + xlab("Fluoroscopy time (min)") + ylab("number of subjects") + theme_light() + theme(panel.grid.minor = element_blank(), panel.grid.major.x = element_blank())
关键修改点
- 将
stat_bin的y = after_stat(count / sum(count))改为y = after_stat(count):让标签的y坐标和柱子顶端的计数完全对齐 - 保留
label = scales::percent(after_stat(count / sum(count))):只改变标签显示的内容,不改变位置映射 - 用
vjust = -0.2将标签向上微调,避免和柱子顶端重叠(可根据实际显示效果调整数值,比如-0.1或-0.3) - 统一定义
bin_breaks变量:减少重复代码,保证分组区间完全一致
内容的提问来源于stack exchange,提问作者Álvaro
相关产品推荐
相关产品推荐

