ggplot 轮廓抖动数据点

ggplot outline jitter datapoints

我正在尝试创建一个点抖动的散点图 (geom_jitter),但我还想在每个点周围创建一个黑色轮廓。目前我是通过添加 2 geom_jitters,一个用于填充,一个用于轮廓来实现的:

beta <- paste("beta == ", "0.15")

ggplot(aes(x=xVar, y = yVar), data = data) + 
    geom_jitter(size=3, alpha=0.6, colour=my.cols[2]) + 
    theme_bw() + 
    geom_abline(intercept = 0.0, slope = 0.145950, size=1) + 
    geom_vline(xintercept = 0, linetype = "dashed") + 
    annotate("text", x = 2.5, y = 0.2, label=beta, parse=TRUE, size=5)+
    xlim(-1.5,4) + 
    ylim(-2,2)+
    geom_jitter(shape = 1,size = 3,colour = "black")

然而,结果是这样的:

因为抖动随机偏移了数据,所以2个geom_jitters并不一致。如何确保轮廓与填充点位于同一位置?

我看到过有关此问题的帖子(例如 Is it possible to jitter two ggplot geoms in the same way?),但它们已经很老了,不确定是否有任何新内容添加到 ggplot 中可以解决此问题

如果我没有使用 geom_jitter,而是使用常规 geom_point,那么上面的代码就可以工作,但是我有太多重叠点以至于无法使用

编辑:

已发布答案中的解决方案有效。然而,它与我的一些其他图表不太合作,我在这些图表中我通过一些其他变量进行分箱并使用它来绘制不同的颜色:

ggplot(aes(x=xVar, y = yVar, color=group), data = data) + 
    geom_jitter(size=3, alpha=0.6, shape=21, fill="skyblue") +
    theme_bw() +
    geom_vline(xintercept = 0, linetype = "dashed") +
    scale_colour_brewer(name = "Title", direction = -1, palette = "Set1") +
    xlim(-1.5,4) + 
    ylim(-2,2)

我的 group 变量有 3 个级别,我想在 brewer Set1 调色板中用不同的颜色为每个组级别着色。目前的解决方案只是将所有东西都涂成天蓝色。我应该填写什么以确保我使用的是正确的调色板?

您实际上不必使用两层;你可以只使用 fill 一个有洞的绘图角色的美学:

# some random data
set.seed(47)
df <- data.frame(x = rnorm(100), y = runif(100))

ggplot(aes(x = x, y = y), data = df) + geom_jitter(shape = 21, fill = 'skyblue')

coloursizestroke 美学让您可以自定义确切的外观。


编辑:

对于分组数据,将 fill 美学设置为分组变量,并使用 scale_fill_* 函数设置色标:

# more random data
set.seed(47)
df <- data.frame(x = runif(100), y = rnorm(100), group = sample(letters[1:3], 100, replace = TRUE))

ggplot(aes(x=x, y = y, fill=group), data = df) + 
    geom_jitter(size=3, alpha=0.6, shape=21) +
    theme_bw() +
    geom_vline(xintercept = 0, linetype = "dashed") +
    scale_fill_brewer(name = "Title", direction = -1, palette = "Set1")