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

Modify spacing between key glyphs in vertical legend whilst keeping key glyph border

作为 this famous thread. I decided to ask a new question because this is more specifically for vertical legends, and the given answers still don't provide a fully satisfactory solution. For polygon key glyphs, there was a suggestion to increase the size of the margin between the actual polygon glyph and the key border, with a modification of the underlying draw_key function 的跟进。但是,如果我想保留边框(例如黑色边框),这实际上不起作用。

并且在使用其他 geom 时(例如,geom_line),我什至没有看到如何增加字形和边框之间的边距 - 简要浏览一下中使用的 draw_key 函数ggplot2:::GeomLine(它不使用导出的 draw_key 函数),我不清楚在哪里修改它。

所以,我的问题是,是否有一种方法可以更改关键字形之间的实际 space,从而允许保留边框(例如,color = "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"))

示例如果我删除颜色,字形看起来会更 spaced,但我希望关键字形与上面的大小相同,只是它们之间 space .

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 package (v2.0.1)

于 2021-12-29 创建

P.S。这个问题是在回答

时出现的

有一种方法可以做到这一点,但不是很直观。这取决于图例指南中的 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 创建

抱怨 raised the suggestion这在其他地方不直观。

如果希望标题在比较正常的位置,可以对主题功能使用如下咒语,其中11pt为默认图例间距:

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