ggplot2中使用aes(colour)时geom_jitter为何重复显示黑色点?
问题根因
这个现象和ggplot2的图层渲染顺序无关,核心是两段代码的执行逻辑完全不一样:
- 第一段代码是连续拼接的完整绘图语句:用
+把ggplot()基础画布、geom_point()原始黑色散点图层、geom_jitter()彩色抖动散点图层拼在了同一个绘图对象里,最终输出的是两个图层叠加的效果。因为geom_jitter()默认抖动幅度很小,原始位置的黑色点没有被彩色点完全盖住,就会露出来。 - 第二段代码的三个语句是互相独立的,根本没有把两个图层加到同一张图上:
- 第一行仅初始化了不带任何图层的基础画布,存入变量
p,不会输出任何图像 - 第二行是给基础画布临时加黑色散点图层,执行后会输出仅含黑色点的图,但R里临时拼接图层不会修改原本存储的
p变量 - 第三行是给最开始那个无图层的基础画布临时加彩色抖动散点图层,执行后输出的是仅含彩色抖动点的图,自然不会出现黑色点。
- 第一行仅初始化了不带任何图层的基础画布,存入变量
复现验证
如果要让第二段代码得到和第一段完全一致的叠加效果,必须把每次加图层的结果重新赋值给变量,或者一次性拼接所有图层,代码如下:
# 方式1:逐层赋值保存修改 p <- ggplot(mpg, aes(cyl, hwy)) p <- p + geom_point() p <- p + geom_jitter(aes(colour = class)) p # 执行后就会看到和第一段代码一致的、露出黑色原始点的效果 # 方式2:一次性拼接所有图层后输出 p <- ggplot(mpg, aes(cyl, hwy)) p + geom_point() + geom_jitter(aes(colour = class))
叠加后露出黑色点的效果如下:
如果不需要显示原始位置的黑色点,直接去掉geom_point()图层,仅保留geom_jitter()即可。
内容的提问来源于stack exchange,提问作者Eduardo Jardim
相关产品推荐
相关产品推荐

