ggplot2与base R直方图绘制不一致,如何让两者表现一致?
解决ggplot2直方图与base R/实际统计不符的问题
问题核心是分箱断点逻辑不一致:
- base R的
hist(breaks=5)针对1-100的数据,会自动生成从0开始的5个等宽区间:(0,20], (20,40], (40,60], (60,80], (80,100],和你手动cut统计的断点完全匹配。 - ggplot2的
bins=5默认会自动计算分箱起点(并非从0开始),导致区间和实际统计的不重合,出现高低区间占比偏低的视觉偏差。
直接解决方案:手动指定分箱断点
把geom_histogram()的bins=5替换为手动指定breaks参数,和你cut时用的断点一致:
ggplot(data_bkd, aes(x=pos)) + geom_histogram(breaks=c(0, 20, 40, 60, 80, 100), fill='gray', col='black') + theme_bw()
这样生成的直方图就会和base R的hist()、手动统计结果完全一致,准确呈现各区间的样本数量。
灵活适配方案:复用base R的分箱断点
如果需要适配不同数据范围,也可以先获取base R hist()的断点,再传给ggplot2:
# 获取base R直方图的断点(不绘图) base_hist_breaks <- hist(data_bkd$pos, breaks=5, plot=FALSE)$breaks # 使用该断点绘制ggplot直方图 ggplot(data_bkd, aes(x=pos)) + geom_histogram(breaks=base_hist_breaks, fill='gray', col='black') + theme_bw()
内容的提问来源于stack exchange,提问作者C. Murtaugh
相关产品推荐
相关产品推荐

