ggplot2,顶部和边缘的传奇

时间:2013-06-12 19:33:51

标签: r graphics ggplot2

请考虑以下事项:

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 outputplot.margin=unit(x=c(0,0,0,0),units="mm")的背景下,传说上方有一个不寻常的白色(红色)空间。有谁知道如何解决这个问题?

感谢任何提示。

此致,约翰

3 个答案:

答案 0 :(得分:29)

就像你说的那样,我在你的例子中看不到它,但我猜测边缘是传说本身。您可以通过添加

来消除图例周围的边距
theme(legend.margin=unit(-0.6,"cm")) # version 0.9.x

到您的ggplot图代码。

UPDATE:从版本2.1.0开始,语法已更改,您应该使用

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

请注意,至少就目前而言,旧解决方案仍然有效。

enter image description here

答案 1 :(得分:11)

如果我夸大边距以获得更多可见性,并运行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)

enter image description here

从中可以看出,不存在的标题在某种程度上占据了空间。

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

让我们看一下传说本身,这似乎导致了这个问题。

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 option in the theme,它被默认值替换为半行。

enter image description here

答案 2 :(得分:7)

自提出/回答此问题以来的一年中,ggplot进入维护模式,因此将来不会有任何更新(意味着OP的strategy of waiting for an update将无效)。

接受的答案依赖于使用legend.margin捏造图例周围的边距。但是,这并不能很好地概括,特别是在使用具有不同大小或比例因子的ggsave()时。幸运的是,有一个更通用的通用解决方案。

legend.margin只需要一个值用于填充所有边,而plot.margin则为顶部,右边,底部和左边距采用四个值。默认边距基于线条(而不是mm或英寸),如下所示: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"))

Correct legend on 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"))

Correct legend on bottom

只要您将感兴趣的边距设置为-0.5行,额外的空白就会消失。这应该适用于任何视口大小以及{{1}的任何宽度/高度/比例组合}