在带有分层符号的 ggplot2 中使用 override.aes() (R)

Using override.aes() in ggplot2 with layered symbols (R)

我最近 在这里允许我添加边框到 ggplot2 中的 geom_point()s,具有可自定义的颜色和粗细。诚然,这有点像 hack,我现在遇到了一些可能因此而导致的麻烦。边框是通过分层两个 geom_point() 生成的,其中一个是我想要的边框颜色,它比提供 "fill" 的 geom_point() 稍大。这里有一个可重现的例子:

require('ggplot2')

values <- rnorm(n = 10, mean = 1, sd = 0.5) + c(1:10)

df <- data.frame(id = rep(c('hq', 'lq'), each = 5),
                 values = values,
                 period = rep(c(1:5), 2))

plot <- 
    ggplot(df, aes(x = period,
                   y = values,
                   group = id,
                   shape = id,
                   color = id)) +
    geom_line(color = 'gray40') +
    geom_point(color = 'gray24',
               size = 4) +
    geom_point(size = 3) +
    guides(shape = guide_legend(override.aes = list(size = 5))) +
    scale_color_manual(values = c('lightskyblue1', 'lightpink'),
                       labels = c('HQ', 'LQ')) +
    scale_shape_manual(values = c(15, 17, 0, 2),
                       labels = c('HQ', 'LQ')) +
    theme_bw()

因为我希望图例符号比绘图符号大,所以我使用了 override.aes()。但是,这意味着我创建的 "borders" 不会出现在图例中:

有什么方法可以为 override.aes() 提供多个 size 参数,以便我在图中使用的分层在图例中保持不变(即图例符号也包含 "borders")?

如果您使用同时具有边框和填充的点标记(pch 值从 21 到 25;请参阅 ?pch),则只需调用 geom_point 即可完成此操作。然后,您可以使用 override.aes 设置图例标记的大小,边框和填充将始终正确显示。例如:

ggplot(dat, aes(x = period,
                y = values,
                group = id,
                shape = id,
                fill=id)) +
  geom_line(color = 'gray40') +
  geom_point(size=4) +
  guides(shape = guide_legend(override.aes = list(size = 5))) +
  scale_fill_manual(values = c('lightskyblue1', 'lightpink'),
                    labels = c('HQ', 'LQ')) +
  scale_shape_manual(values = c(22,24),   # These are the marker shapes
                     labels = c('HQ', 'LQ')) +
  theme_bw()

这会导致点标记(默认值,但您可以更改它)和您指定的填充颜色的黑色边框。

更新:为了回应您的评论,以下是如何在不对原始代码进行任何其他更改的情况下在图例标记上获得黑色边框:

  guides(shape = guide_legend(override.aes = 
                                list(size = 5, shape=c(22,24), 
                                     colour="black", 
                                     fill=c('lightskyblue1', 'lightpink')))) +