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”)。这种方式应该可以,就是有点麻烦
更简单的方法是让自己熟悉所有 ggplot2
的 theme 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)
)
我有以下代码:
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”)。这种方式应该可以,就是有点麻烦
更简单的方法是让自己熟悉所有 ggplot2
的 theme 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)
)