ggplot轮廓抖动数据点

4

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

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_point而不是geom_jitter,则上述代码有效,但是我的重叠点太多了,无法使用。
编辑:
发布的答案中的解决方案有效。但是,它对我的其他图表不太合作,在那些图表中,我通过某些其他变量进行分组,并使用该变量绘制不同颜色。
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调色板中为每个组别级别着不同的颜色。当前的解决方案只会将所有内容着成天蓝色。我应该填什么以确保使用正确的颜色调色板?


你能在 ggplot() 之前对数据进行 jitter 吗? - Hugh
2个回答

6

您实际上不必使用两个图层,只需使用具有孔的绘图字符的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')

带有黑色轮廓的浅蓝色点图

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


编辑:

对于分组数据,请将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


1
这对于简单的图表效果很好,但我的其他一些图表具有需要使用颜色调色板中不同颜色的分组变量。该解决方案在这些情况下并不普遍适用。请参见编辑代码。 - Simon
请看编辑;我无法在评论中放置它。基本上,您需要做的就是将所有的“colour”美学和函数替换为“fill”。 - alistaire

0
这个解决方案稍微复杂一些,但是之前提出的那些方法我遇到了一些问题。
我创建了一个抖动虚拟列。然后我调整了抖动虚拟列的坐标以适应各个组。我还在要制作箱线图时标记了异常值,以便在箱线图中不重复出现,同时也不会与抖动效果重叠。
对于黑色光晕,添加了两个geom_point。这两个geom_point都使用了相同的调整后的抖动坐标。第一个geom_point的大小比第二个geom_point大。然后给第二个geom_point设置所需的颜色。
set.seed(123)
df <- data.frame(group = rep(c("A", "B", "C"), 300), 
                 y = rnorm(300))

ggplot(data = df, mapping = aes(x = group, y = y)) +
    geom_boxplot()

set.seed(123)
processed_df <- df %>%
  group_by(group) %>%
  # Calculating & adjusting x-axis jitter coordinates
  mutate(x_jitter = runif(n(), min = 0.75, max = 1.25),
         group_adjusted_jitter = x_jitter + (cur_group_id() - 1)) %>%
  # Flagging outliers to prevent duplicate data points
  mutate(quantile_1 = quantile(y, probs = 0.25, na.rm = TRUE),
         quantile_3 = quantile(y, probs = 0.75, na.rm = TRUE),
         iqr = IQR(y, na.rm = TRUE),
         bottom_outlier = y < (quantile_1 - 1.5 * iqr),
         upper_outlier = y > (quantile_3 + 1.5 * iqr),
         outlier = bottom_outlier | upper_outlier) %>%
  ungroup()

ggplot(data = processed_df, mapping = aes(y = y)) +
  # Boxplot without outlier to prevent redundant points when jitter is added
  geom_boxplot(data = subset(processed_df, !outlier),
               mapping = aes(x = group)) +
  # Jittered point for black halo
  geom_point(mapping = aes(x = group_adjusted_jitter), 
             size = 3) +
  # Smaller sized jitter point with group coloring
  geom_point(mapping = aes(x = group_adjusted_jitter, color = group), 
             size = 2) 


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接