ggplot2& facet_wrap - 消除小平面之间的垂直距离

时间:2015-06-22 15:19:30

标签: r plot ggplot2

我正在处理一些我希望显示为nxn网格图的数据。 修改:为了更清楚,我的数据中有21个类别。我希望按类别划分,并将这21个图形放在一个5 x 5平方网格中(其中孤儿本身位于第五行)。因此facet_wrap而不是facet_grid。

我已经编写了以下代码(使用旧的虹膜数据集作为我可重现的示例):

library(ggplot2)
library(grid)

cust_theme <- theme_bw() + theme(legend.position="none", 
              axis.title = element_blank(), axis.ticks = element_blank(), 
              axis.text = element_blank(), strip.text = element_blank(), 
              strip.background = element_blank(), panel.margin = unit(0, "lines"), 
              panel.border = element_rect(size = 0.25, color = "black"), 
              panel.grid = element_blank())

iris.plot <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
             geom_point() + cust_theme + facet_wrap( ~ Species, ncol = 2) + 
             labs(title = "Irises by species")

这给了我几乎我想要的东西,但并不完全:

Plot of iris data set per above code.

我在最上面一排的地块和底行之间仍然留有一小块空间。我想完全摆脱它,但panel.margin显然没有这样做。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:6)

panel.margin参数更改为panel.margin = unit(c(-0.5,0-0.5,0), "lines")。出于某种原因,顶部和底部边距需要为负,才能完美排列。结果如下:

enter image description here

答案 1 :(得分:5)

这可能有点晚,但panel.margin现已弃用。在theme内使用panel.spacing。要消除构面之间的间距,请加载grid包并使用panel.spacing = unit(0, "lines")

答案 2 :(得分:4)

您也可以直接编辑grobs:

library(ggplot2)
library(grid)

g <-  ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  geom_point() +
  facet_wrap( ~ Species, ncol = 2) +
  labs(title = "Irises by species") +
  theme_bw() +
  theme(panel.margin = unit(0, "lines")) +
  theme(plot.margin = unit(c(0,0,0,0), "lines")) +
  theme(strip.background = element_blank()) +
  theme(plot.background = element_blank()) +
  theme(strip.text = element_blank()) +
  theme(axis.ticks.margin = unit(0, "lines"))

g <- ggplotGrob(p)

g$heights[[7]] = unit(0, "lines")

grid.newpage()
grid.draw(g)

enter image description here