30

考虑以下:

library(ggplot2)
library(grid)
ggplot(diamonds, aes(clarity, fill=cut)) + 
  geom_bar() +   
  theme(
    plot.margin=unit(x=c(0,0,0,0),units="mm"),
    legend.position="top",
    plot.background=element_rect(fill="red")) +
  guides(fill=guide_legend(title.position="top"))

它的输出看起来像这样: 在图例上方有大量不合时宜的白色(红色)空间ggplot2 输出 的上下文中。plot.margin=unit(x=c(0,0,0,0),units="mm")有谁知道如何补救?

感谢您的任何提示。

真诚的,乔

4

3 回答 3

38

就像你说的,我在你的例子中看不到它,但我猜边距是传说本身。您可以通过添加以下内容来消除图例本身的边距:

+ theme(legend.margin=margin(t = 0, unit='cm'))

这适用于 ggplot2 v2.1.0 或更高版本。请注意,至少目前,旧的解决方案仍然有效:

+ theme(legend.margin=unit(-0.6,"cm")) # version 0.9.x

于 2013-06-12T19:55:27.363 回答
14

如果我夸大边距以获得更多可见性,并运行 showViewports,我会得到以下信息:

p + guides(fill=guide_legend(keyheight=unit(1,"cm"))) + theme(plot.margin=unit(c(1,1,1,1),"cm"))
showViewport(col="black",label=TRUE, newpage=TRUE, leaves=FALSE)

在此处输入图像描述

由此看来,不存在的标题以某种方式占用了空间。

编辑:不,这只是标签的不幸重叠。这不是标题。

让我们看看传说本身,这似乎是造成问题的原因。

library(gtable)
g = ggplotGrob(p)
leg = gtable_filter(g, "guide")
plot(leg)
leg$heights
# sum(0.5lines, sum(1.5mm, 10mm, 0mm, 1.5mm), 0.5lines)+0cm
grid.rect(height=leg$heights) 
grid.rect(height=leg$heights - unit(1,"line"), gp=gpar(lty=2))

所以,确实,是图例增加了一些边距(总共 0.5 + 0.5 = 1 行)。我认为它是guide.margin 主题中缺少的选项,它被替换为默认值半行。

在此处输入图像描述

于 2013-06-12T20:27:23.677 回答
9

自提出/回答此问题以来的一年中, ggplot 进入维护模式,因此不会有任何未来更新(这意味着 OP等待更新的策略将不起作用)。

接受的答案依赖于用legend.margin. 但是,这并不能很好地概括,尤其是在使用ggsave()不同的大小或比例因子时。不过,幸运的是,有一个更通用、更通用的解决方案。

legend.margin只需要一个值用于所有边的填充,而plot.margin需要四个值用于顶部、右侧、底部和左侧边距。默认边距基于线条(而不是毫米或英寸),如下所示:plot.margin=unit(c(c(1, 1, 0.5, 0.5)), units="line")

如果设置legend.margin为 0,则可以使用plot.margin基于线单位的负值将图例移动到绘图区域的边缘。将上边距设置为 -0.5 效果很好:

ggplot(diamonds, aes(clarity, fill=cut)) + 
  geom_bar() +   
  theme(
    plot.margin=unit(c(-0.5, 1, 0.5, 0.5), units="line"),
    legend.position="top",
    plot.background=element_rect(fill="red"),
    legend.margin=unit(0, "lines")) +
  guides(fill=guide_legend(title.position="top"))

正确的图例在顶部

如果图例位于底部,则相同的想法有效:

ggplot(diamonds, aes(clarity, fill=cut)) + 
  geom_bar() +   
  theme(
    plot.margin=unit(c(1, 1, -0.5, 0.5), units="line"),
    legend.position="bottom",
    plot.background=element_rect(fill="red"),
    legend.margin=unit(0, "lines")) +
  guides(fill=guide_legend(title.position="top"))

底部的正确图例

只要您将感兴趣的边距设置为 -0.5 行,多余的空格就会消失。这应该适用于任何视口大小和任何宽度/高度/比例组合ggsave()

于 2014-05-13T02:25:39.437 回答