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

9

我最近在这里提出了一个问题,它使我能够为ggplot2中的geom_point()添加具有可自定义颜色和粗细的边框。不可否认,这有点像一个hack,现在我遇到了一些问题,可能是由此引起的。边框是通过叠加两个geom_point()生成的,其中一个是我想要的边框颜色,并且稍微大于提供“填充”的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()。然而,这意味着我创建的“边框”不会出现在图例中:

enter image description here

是否有某种方法可以给override.aes()多个size参数,以便在图例中保留我在绘图中使用的分层(即图例符号也包含“边框”)?
1个回答

13

如果你使用既有边框又有填充的点标记(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')))) +

感谢您的回复。我知道 pch 21-25 的存在。问题在于,虽然在这个小例子中边框看起来很好,但我生成的实际图形具有更小的形状和更多的数据点,这使得 pch 边框过于粗厚。这就是为什么我选择了这个“hack”修复方法。如果您知道如何修改 pch 21-25 形状的边框大小,那就太好了! - thagzone
1
我不知道如何更改点标记的边框,但请参考我的答案更新,了解如何在不对原始代码进行任何其他更改的情况下使图例看起来符合您的要求。 - eipi10
太棒了!微小的差别很重要。我一直在尝试使用 alpha = list(1, 1, .5) 调整 alpha 值。谁知道只需要使用 c(1, 1, .5) 就可以了。 - o_v
只是为了更新这个旧答案,你可以使用 stroke 来设置点标记的边框厚度(例如,stroke=0.3)。 - eipi10

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