使用scale_x_continuous设置直方图X轴限为何会过滤数据?
关于ggplot2中
scale_x_continuous与coord_cartesian的差异解释 核心区别:数据过滤 vs 视图裁剪
scale_x_continuous(limits = c(-3,5))是从数据层面下手:它会先筛掉所有x值不在[-3,5]范围内的观测行,再基于过滤后的数据绘图。你觉得没有缺失数据,但直方图是通过stat_bin()做分箱统计生成的——可能你的原始数据刚好贴近边界,分箱后某个区间的端点超出了设定范围,这部分临时统计数据会被判定为"超出范围",进而被当作缺失值剔除,所以会弹出移除4行的警告;哪怕扩大范围,只要分箱产生的临时点超出新范围,警告依然会出现。coord_cartesian(xlim = c(-3,5))是在绘图层面裁剪:它完全不碰原始数据,只是把图表的显示窗口限定在[-3,5]区间,所有数据(包括分箱生成的临时点)都保留,只是超出窗口的部分不显示,自然不会有数据被移除的警告,完美匹配你要的显示效果。
为什么oob=keep会报错
oob参数用来定义超出scale范围的数据处理逻辑,默认是scales::censor(把超出值设为NA),而scales::keep会保留原始值。但直方图依赖统计变换生成临时数据,oob=keep的逻辑和统计变换的流程冲突,导致报错。如果硬要用scale的方式实现,得先手动计算分箱统计结果,再用geom_col()绘制,远不如coord_cartesian简便。
总结建议
如果只是要调整图表的显示范围、匹配其他图的视觉效果,直接用coord_cartesian(xlim)就好;只有当你需要真正过滤掉超出范围的原始数据时,才用scale_x_continuous(limits)。
内容的提问来源于stack exchange,提问作者cpsyctc
相关产品推荐
相关产品推荐

