ggplot2:每个方面网格的空间图例/操纵各个图例条目的位置[重复]

Posted

技术标签:

【中文标题】ggplot2:每个方面网格的空间图例/操纵各个图例条目的位置[重复]【英文标题】:ggplot2: space legend per facet grid / manipulate position of individual legend entries [duplicate] 【发布时间】:2021-10-25 09:00:55 【问题描述】:

我有以下代码:

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)

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

谢谢!

【问题讨论】:

也许你可以试试gridExtra 包。如果您想使用它,请参阅this post。 您能否再解释一下您的意思是“每个带有空格的网格的单独图例”? 你可能会觉得这篇文章很支持:***.com/questions/14840542/… 【参考方案1】:

有几种方法可以解决这个问题。您可以继续使用 gridExtra 包并基本上逐个构建您的情节(构建 grobs 或“图形对象”)。这种方式应该可以,但是有点麻烦。

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

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

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

首先,让我们自己控制键的位置,使其垂直展开。我们可以通过将每个键的高度设置为绘图总空间的 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)
  )

【讨论】:

谢谢!我知道gridExtra 解决方案,但这更优雅。

以上是关于ggplot2:每个方面网格的空间图例/操纵各个图例条目的位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章

R 中牛图网格的一个共享图例

将水平线添加到 R 中 ggplot2 中的堆叠条形图,并在图例中显示

R:在 ggplot2 中设置图例和颜色

R语言ggplot2可视化为复杂图自定义图例手动构造图例(legend)实战

ggplot2:图例混合颜色和隐藏线用于预测图

ggplot2:为彩色条形图和图例添加不同的纹理[重复]