自提出/回答此问题以来的一年中, 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()