4

作为这个著名线程的后续行动。我决定提出一个新问题,因为这更专门针对垂直图例,并且给出的答案仍然不能提供完全令人满意的解决方案。对于多边形键字形,建议通过修改底层的 draw_key 函数来增加实际多边形字形和键边框之间的边距大小。但是,如果我想保留边框,例如黑色,这实际上不起作用。

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

所以,我的问题是,是否有一种方法可以改变键字形之间的实际空间,从而允许保留边框(例如,颜色 =“黑色”),并且不增加字形大小。

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 包于 2021-12-29 创建(v2.0.1)

PS 这个问题是在回答这个有趣的问题时出现的

4

1 回答 1

3

有一种方法可以做到这一点,但它不是很直观。这取决于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 包于 2021-12-30 创建 (v2.0.0 )

抱怨 提出了这样的建议,即这在其他地方是不直观的。

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

legend.title = element_text(
  margin = margin(
  b = -1 + grid::convertUnit(unit(11, "pt"), "cm", valueOnly = TRUE), 
  unit = "cm")
)
于 2021-12-29T23:22:50.483 回答