如何在ggplot分面图表的每个分面背景显示全部灰色数据?
解决ggplot分面中每个面板显示全部灰色背景点的问题
要实现每个facet_wrap(~gear)分面里,背景显示全部mtcars数据的灰色点,前景显示当前分面对应gear组的彩色点,可以用以下两种方法:
方法一:禁用aes继承
通过inherit.aes = FALSE让灰色点的图层不受分面分组的筛选,直接绘制完整数据:
library(ggplot2) p <- ggplot(data = mtcars, aes(x = mpg, y = disp)) + # 绘制全部数据的灰色背景点,不继承分面的分组规则 geom_point(data = mtcars, aes(x = mpg, y = disp), color = 'grey', inherit.aes = FALSE) + # 绘制当前分面对应gear组的彩色点 geom_point(aes(color = as.factor(gear))) + facet_wrap(~gear) print(p)
方法二:构造全部分组的背景数据
用crossing()生成每个gear组对应的完整数据集,确保每个分面都能拿到全部数据:
library(ggplot2) library(tidyr) # 为每个gear组复制一份完整的mtcars数据 bg_data <- crossing(gear = unique(mtcars$gear), mtcars) p <- ggplot() + # 灰色背景点:每个gear分面都显示全部数据 geom_point(data = bg_data, aes(x = mpg, y = disp), color = 'grey') + # 彩色点:仅显示当前gear组的数据 geom_point(data = mtcars, aes(x = mpg, y = disp, color = as.factor(gear))) + facet_wrap(~gear) print(p)
为什么之前的尝试有问题?
- 第一次代码中,灰色点图层虽然调用了完整mtcars数据,但因为分面按
gear筛选,每个分面只显示对应组的行,所以灰色点也只有当前组的数据。 - 第二次代码新增了
gear = "All"的分组,导致facet多生成一个"All"面板,不符合需求。
内容的提问来源于stack exchange,提问作者curious
相关产品推荐
相关产品推荐

