ggplot2中geom_rect与facet_grid搭配使用时点数据异常重复问题
异常产生原因
你遇到的问题本质是ggplot2的图层数据继承与分面分组逻辑冲突导致的:
- 你调用
geom_rect时没有为该图层单独指定数据集,也没有在映射中关联分面用到的category.1、category.2两个分组变量 - 当ggplot2执行分面逻辑时,会默认把没有明确分组关联的图层识别为「全局通用图层」,为了让这类图层能在所有分面正常显示,会自动对当前已有的数据集(也就是你给
geom_point用的syn.dat)做全量分组展开,导致每个分面都被塞入了全部的点数据,而非对应分组的点数据。
修复方案
有两种常用的修复方法,都可以保证每个分面只显示对应分组的点,同时所有分面都保留背景阴影:
方案1:给geom_rect单独指定空数据集,关闭继承
明确告诉geom_rect不需要继承其他图层的数据集,也不需要匹配分面分组:
ggplot() + geom_rect( data = data.frame(), aes(xmin = -Inf, xmax = Inf, ymin = .5, ymax = Inf), fill = "lightyellow", inherit.aes = FALSE ) + geom_point(data = syn.dat, aes(x = x, y = y)) + facet_grid(cols = vars(category.1), rows = vars(category.2))
方案2:用annotate绘制全局注释
annotate是ggplot2专门用来绘制全局非数据关联注释的函数,本身不会参与分面的分组计算,更适合这类全分面统一背景的场景:
ggplot(syn.dat, aes(x = x, y = y)) + annotate("rect", xmin = -Inf, xmax = Inf, ymin = .5, ymax = Inf, fill = "lightyellow") + geom_point() + facet_grid(cols = vars(category.1), rows = vars(category.2))
内容的提问来源于stack exchange,提问作者InColorado
相关产品推荐
相关产品推荐

