ggplot2:space 每个面网格的图例/操纵单个图例条目的位置

ggplot2: space legend per facet grid / manipulate position of individual legend entries

我有以下代码:

ggplot(data = mpg[is.element(mpg$manufacturer, c("audi", "dodge", "ford")),], mapping = aes(x = year, colour = manufacturer)) +
  geom_line(stat = "count") +
  facet_wrap(~manufacturer, nrow = 3)

这给了我这个情节,但我想要的是用一个分隔每个网格的图例 space。潜在的问题是是否有办法操纵单个图例条目并操纵它们的位置?

谢谢!

有几种方法可以解决这个问题。您可以开始使用 gridExtra 包并基本上逐个构建您的绘图(构建 grobs 或“图形 objects”)。这种方式应该可以,就是有点麻烦

更简单的方法是让自己熟悉所有 ggplot2theme elements,这将使您能够控制情节的各个方面。

以下是我在 theme() 中一起使用的元素,以使事情看起来正确:

  • legend.key.height。此元素控制每个图例“键”的高度。这些是代表密钥标题旁边的行的符号。
  • legend.key.width。图例键的宽度...相同。
  • legend.key。我们将其设置为 element_blank()。这是钥匙的背景部分。如果我没有将其设置为空白,那么线条下方会有那些大的灰色矩形,看起来很奇怪。撇开这个你就会明白我的意思了。
  • legend.title。这控制图例标题的主题。在这里,我用它来控制标题的边距,如您所见...
  • plot.margin。地块周围的区域。

首先,让我们控制按键本身的位置,使其稍微垂直展开。我们可以通过将每个键的高度设置为绘图总高度 space 的大约 1/3 来做到这一点。 "npc"是基本对应相对绘图面积的单位,所以0.33 npc对于每个键的大小来说会略小于绘图的三分之一。我使用 legend.key.width 使按键更宽,然后使用 legend.key = element_blank().

删除每个按键的灰色背景
plot + theme(
    legend.key.height = unit(0.3, "npc"),
    legend.key.width = unit(30, "pt"),
    legend.key = element_blank()
  )

这让我们接近了,但还差得远。原因是传奇标题仍然与情节的顶部对齐。最佳情况下,您希望标题 高于 位于图的顶部,以便键与每个图居中对齐。为了做到这一点,我们可以使用一些技巧...我可以通过 将边距设置为负数 来欺骗 ggplot2 将图例的标题向上移动]!这会将标题向上移动,但也会将其放在绘图区域上方。作为回应,我们还将增加地块区域的上边距,以确保标题保留在地块上。这是对结果图执行此操作的最终代码:

plot + theme(
    legend.key.height = unit(0.3, "npc"),
    legend.key.width = unit(30, "pt"),
    legend.key = element_blank(),
    legend.title = element_text(margin=margin(t=-30)),
    plot.margin=margin(t=30)
  )