【问题标题】:Increase space between legend keys without increasing legend keys在不增加图例键的情况下增加图例键之间的空间
【发布时间】:2018-04-05 09:02:33
【问题描述】:

这是https://stackoverflow.com/questions/32275113的后续行动

问题是调整图例元素以增加图例键之间的空间,而不同时扩展图例键本身。解决方案可能是调整正确的图例主题选项。

期望的结果:图例关键文本标签之间的垂直空间更大,但不会拉伸图例关键行。

d <- data.frame(x = mtcars$mpg, y = 0.10)
vlines <- rbind(aggregate(d[1], d[2], mean), 
                aggregate(d[1], d[2], median))
vlines$stat <- rep(c("mean", "median"), each = nrow(vlines)/2)
library("ggplot2")
ggplot(data = d, aes(x = x, y = ..density..)) + 
    geom_histogram(fill = "lightblue", color = "black") + 
    geom_vline(data = vlines, mapping = aes(xintercept = x, colour = stat), 
            show.legend = TRUE) +
    theme(legend.direction = "vertical", 
        legend.position = "right",
        #          legend.key = element_rect(size = 2),
        legend.key.size = unit(3, "cm"),
        #          legend.key.width = unit(2, "cm"),
        #          legend.key.height = unit(1, "cm")
        )

增加legend.key.size,如链接问题的答案中所建议的(见上文),也会产生增加垂直线的不良副作用。

编辑基于 PoGibas 的巧妙解决方法,这里是所需结果的屏幕截图,包含在此处以确保目的明确:

在 PoGibas 之后,我在颜色指南中使用了:shape = 73legend.key.height = unit(2, "cm")size = 6

【问题讨论】:

  • 标签之间的垂直空间更大还是框之间的垂直空间更大?
  • @PoGibas:图例标签“mean”和“median”之间有更多空白,截图上的图例关键行更短,至于灰色框我不介意,因为我会留空反正他们出去。 (因此要么减少灰色框及其内容,要么减少框内的垂直线)谢谢!
  • 我在文档中没有看到这样的选项。文本通常通过对齐(左,右)来移动。但是您必须证明每个标签的不同方向是合理的。
  • @StephenHenderson,我们两个!有时我会错过显而易见的事情,但看起来 PoGibas 也不相信有内置选项。

标签: r ggplot2


【解决方案1】:

一种解决方案是用点替换线(需要额外的几何层):

创建带有不可见点的绘图(size = 0 和矩形形状shape = 15)。

p <- ggplot(d, aes(x, ..density..)) + 
    geom_histogram(fill = "lightblue", color = "black") + 
    geom_vline(data = vlines, mapping = aes(xintercept = x, colour = stat)) +
    geom_point(data = vlines, aes(0, 0, colour = stat), size = 0, shape = 15)

将图例主题添加到:

  • 图例中的蒙版背景颜色 (legend.key = element_rect(fill = "white"))
  • 创建大图例 (legend.key.height = unit(3, "cm"))
  • 删除线条 (linetype = 0) 并制作大点 (size = 5)

代码:

p + 
    theme(legend.direction = "vertical", 
          legend.position = "right",
          legend.key = element_rect(fill = "white"),
          legend.key.height = unit(3, "cm")) +
    guides(color = guide_legend(override.aes = list(linetype = 0, size = 5)))

PS:

  • 这不是一个完美的解决方案,因为图例标签和框之间存在间隙。
  • 如果你想要线条而不是矩形,请使用shape = 73

【讨论】:

  • 太好了,谢谢!我更喜欢有一个线路键,而不是一个点键......我猜可以通过调整它的宽度将看起来方形的点键变成一个看起来像段的线路键(线路图例不应该是一个正方形,它应该看起来像一条线段)...我是否相信没有内置的ggplot 选项可以独立于框来控制框内线段的长度?
  • 使用形状 73,即字母“I” :-)
  • 是的,shape = 73 做到了!