我使用facet_wrap绘制了由两个因子分组的2d面板。
最小例子:
library(ggplot2)
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~ cyl + drv)
每个面板顶部的标签有两行,我想减少两行标签文本之间的间距。我怎么能正确地做到这一点?
我试过了:
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~ cyl + drv) +
theme(
strip.text = element_text(
margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "pt")
)
)
但这不起作用。
提前致谢。
答案 0 :(得分:5)
您可以指定一个贴标签,将标签放入同一条带而不是创建两个条带:
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~ cyl + drv,
labeller = function (labels) {
labels <- lapply(labels, as.character)
list(do.call(paste, c(labels, list(sep = "\n"))))
})
答案 1 :(得分:4)
接受的答案是实现所需输出的最直接,最简单的方法,但我用这个问题作为了解更多关于使用grobs的机会,我想我会分享我学到的东西。
要修改构面标签之间的间距,我们可以操纵底层的凹凸。为此,首先生成绘图grob:
library(ggplot2)
library(grid)
p <- ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~ cyl + drv)
g <- ggplotGrob(p)
现在,我们可以检查grobs。小面条是凹凸不平的47到55(9个凹凸),我们注意到每个条形凹槽实际上是一个凹凸台:
g
# TableGrob (21 x 15) "layout": 62 grobs
# z cells name grob
# 1 0 ( 1-21, 1-15) background rect[plot.background..rect.614]
# 2 1 ( 7- 7, 4- 4) panel-1-1 gTree[panel-1.gTree.33]
# 3 1 (12-12, 4- 4) panel-2-1 gTree[panel-4.gTree.78]
# ...
# 47 2 (16-16, 4- 4) strip-t-1-3 gtable[strip]
# 48 2 (16-16, 8- 8) strip-t-2-3 gtable[strip]
# 49 2 (16-16,12-12) strip-t-3-3 gtable[strip]
# 50 2 (11-11, 4- 4) strip-t-1-2 gtable[strip]
# 51 2 (11-11, 8- 8) strip-t-2-2 gtable[strip]
# 52 2 (11-11,12-12) strip-t-3-2 gtable[strip]
# 53 2 ( 6- 6, 4- 4) strip-t-1-1 gtable[strip]
# 54 2 ( 6- 6, 8- 8) strip-t-2-1 gtable[strip]
# 55 2 ( 6- 6,12-12) strip-t-3-1 gtable[strip]
# 56 4 ( 4- 4, 4-12) xlab-t zeroGrob[NULL]
# ...
关注grob 47,我们可以深入研究结构...
str(g$grobs[[47]], m = 1)
str(g$grobs[[47]]$grobs, m = 1)
str(g$grobs[[47]]$grobs[[1]], m = 1)
str(g$grobs[[47]]$grobs[[1]]$children, m = 1)
str(g$grobs[[47]]$grobs[[1]]$children[[2]], m = 1)
str(g$grobs[[47]]$grobs[[1]]$children[[2]]$children, m = 1)
...直到我们找到如何指定构面标签:
str(g$grobs[[47]]$grobs[[1]]$children[[2]]$children[[1]], m = 1)
# List of 11
# $ label : chr "8"
# $ x :Class 'unit' atomic [1:1] 0.5
# .. ..- attr(*, "valid.unit")= int 0
# .. ..- attr(*, "unit")= chr "npc"
# $ y :Class 'unit' atomic [1:1] 0.5
# .. ..- attr(*, "valid.unit")= int 0
# .. ..- attr(*, "unit")= chr "npc"
# $ just : chr "centre"
# $ hjust : NULL
# $ vjust : NULL
# $ rot : num 0
# $ check.overlap: logi FALSE
# $ name : chr "GRID.text.322"
# $ gp :List of 6
# ..- attr(*, "class")= chr "gpar"
# $ vp : NULL
# - attr(*, "class")= chr [1:3] "text" "grob" "gDesc"
现在,我们可以更改y
的值,以便顶部grob的标签靠近底部,底部grob的标签靠近顶部。我只对最左边列中的小平面条执行此操作,以便我们可以看到差异:
for (i in c(47, 50, 53)) {
g$grobs[[i]]$grobs[[1]]$children[[2]]$children[[1]]$y = unit(0.1, "npc")
g$grobs[[i]]$grobs[[2]]$children[[2]]$children[[1]]$y = unit(0.9, "npc")
}
grid.newpage()
grid.draw(g)