在垂直图例中修改关键字形状之间的间距,同时保留关键字形状的边框。

5
作为对这个著名帖子的跟进,我决定提出一个新问题,因为这更具体地针对垂直图例,并且给定的答案仍然没有提供完全令人满意的解决方案。对于多边形关键字形状,有建议增加实际多边形图形和关键字边框之间的空白大小,并进行底层draw_key函数的修改,但是,如果我想保持边框(例如黑色),这并不真正起作用。

当使用其他几何形状(例如geom_line)时,我甚至不知道如何增加图形和边框之间的空白大小——在ggplot2:::GeomLine中使用的draw_key函数简要查看时(它没有使用导出的draw_key函数),我不清楚应该在哪里进行修改。

所以,我的问题是是否有一种方法可以更改关键字形状之间的实际间隔,从而允许保留边框(例如颜色="black"),而不增加图形大小。

library(ggplot2)

p <- ggplot(dplyr::filter(msleep, grepl("^C", order)), 
       aes(sleep_total, sleep_rem, color = order)) +
  geom_line(na.rm = TRUE) +
  theme(legend.key = element_rect(color = "black"))
p

示例图:主要的图形接触。

p + theme(legend.key.height = unit(.5, "in"))

如果我移除颜色,这个示例看起来似乎字形之间有更多的空隙,但我希望关键字形大小与上面相同,只是它们之间有间距。

在GeomLine中的底层draw_key函数

# ggplot2:::GeomLine$draw_key
#> ...
#> segmentsGrob(0.1, 0.5, 0.9, 0.5, gp = gpar(col = alpha(data$colour %||% 
#>                                                          data$fill %||% "black", data$alpha), fill = alpha(params$arrow.fill %||% 
#>                                                                                                              data$colour %||% data$fill %||% "black", data$alpha), 
#>                                            lwd = (data$size %||% 0.5) * .pt, lty = data$linetype %||% 
#>                                              1, lineend = "butt"), arrow = params$arrow)
#> ...

reprex软件包 (v2.0.1) 创建于2021年12月29日

注:这个问题是在回答这个有趣的问题时提出的。

1个回答

4

有一种方法可以实现这个功能,但不是非常直观。它取决于图例指南中的 byrow 设置,无论是否遵守图例间距(不要问我为什么!)。

library(ggplot2)

ggplot(dplyr::filter(msleep, grepl("^C", order)), 
            aes(sleep_total, sleep_rem, color = order)) +
  geom_line(na.rm = TRUE) +
  guides(
    color = guide_legend(byrow = TRUE)
  ) +
  theme(legend.key = element_rect(color = "black"),
        legend.spacing.y = unit(1, "cm"))

这是由 reprex package (v2.0.0) 在 2021-12-30 创建的。

我已经提出了一个建议,认为在其他地方这种方式不够直观,详情请见此处

如果您希望标题处于相对正常的位置,则可以使用以下语句到主题函数中,其中11pt是默认图例间距:

legend.title = element_text(
  margin = margin(
  b = -1 + grid::convertUnit(unit(11, "pt"), "cm", valueOnly = TRUE), 
  unit = "cm")
)

2
Teunbrand。再次感谢,肯定不是最后一次 :) 我已经根据Tung的答案更新了链接线程,并将此线程关闭为重复。新年快乐。 - tjebo

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