ggplot轮廓抖动数据点

时间:2016-03-13 02:06:35

标签: r ggplot2 scatter-plot

我正在尝试创建一个散点图,其中点是抖动的(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")

然而,结果是这样的:

enter image description here

由于抖动会随机偏移数据,因此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调色板中用不同的颜色为每个组级别着色。目前的解决方案只是为天空蓝色着色。我应该填写什么以确保我使用正确的调色板?

1 个答案:

答案 0 :(得分:5)

你实际上不必使用两层;你可以使用带有洞的绘图角色的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')

plot with light blue dots with black outlines

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")

grouped scatterplot with outlined dots