在 ggplot2 和 facet_wrap 中,如何删除所有边距和填充但保留 strip.text?
In ggplot2 and facet_wrap, how to remove all margins and padding yet keep strip.text?
这可能主要是因为我误解了 panel.margin = unit(...)
在 theme()
函数中的工作方式...但我无法按照我的方式在 facet_wrap 中自定义边距喜欢。基本上,我想要一个看起来像这样的 facet_grid,在每个方面插入方面文本(即 strip.text
),每个方面之间没有 spcaing:
(我留下了粉红色的边框以显示每个面的尺寸)
到目前为止,这是代码。
设置数据和绘图:
library(ggplot2)
library(grid)
p <- ggplot() +
geom_bar(data = mtcars, aes(x = cyl, y = qsec), stat = 'identity') +
facet_wrap( ~ carb, ncol = 3)
mytheme <- theme_minimal() + theme(
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
panel.margin = unit(0, "lines"),
panel.border = element_rect(colour = rgb(1.0, 0, 0, 0.5), fill=NA, size=1)
)
标准地块
p + mytheme
完全删除 strip.text
p + mytheme + theme(strip.text = element_blank())
添加 strip.text 并插入它
p + mytheme +
theme(strip.text = element_text(size = rel(3.0), vjust = -4.0))
strip.text 的 re-inclusion(以及增加的相对大小)增加了两行之间的垂直边距。所以在这一点上,我不知道如何关闭顶部和底部行之间的垂直间隙。
负边距过多
p + mytheme +
theme(strip.text = element_text(size = rel(3.0), vjust = -4.0),
panel.margin = unit(c(-2, -2), "lines"))
那么如何只定位两行之间的 panel.margin?
编辑: 附加信息。行之间的 space 似乎是 strip.background
:
p + mytheme +
theme(strip.text = element_text(size = rel(3.0), vjust = -4.0),
panel.margin = unit(-1, "lines"),
strip.background = element_rect(fill = rgb(0, 1.0, 0, 0.2)))
在 theme()
的可能参数列表中,不仅有 panel.margin
("margin around facet panels (unit)",参见 ?theme
),而且为了方便,您还可以访问一个一次轴数,分别为 panel.margin.x
和 panel.margin.y
("horizontal/vertical margin around facet panels (unit; inherits from panel.margin)").
因此,虽然将边距降低到零以下感觉有点像 hack,但像下面这样的东西就可以完成这项工作(你可能需要稍微调整一下值 - unit(-2, "lines")
对我来说效果最好):
p + theme(strip.text = element_text(size = rel(3.0), vjust = -4.0),
panel.margin.y = unit(-2, "lines"))
如果您使用 strip.text = element_blank()
,那么您应该使用 panel.margin.y = unit(-0.5, "lines")
。
这可能主要是因为我误解了 panel.margin = unit(...)
在 theme()
函数中的工作方式...但我无法按照我的方式在 facet_wrap 中自定义边距喜欢。基本上,我想要一个看起来像这样的 facet_grid,在每个方面插入方面文本(即 strip.text
),每个方面之间没有 spcaing:
(我留下了粉红色的边框以显示每个面的尺寸)
到目前为止,这是代码。
设置数据和绘图:
library(ggplot2)
library(grid)
p <- ggplot() +
geom_bar(data = mtcars, aes(x = cyl, y = qsec), stat = 'identity') +
facet_wrap( ~ carb, ncol = 3)
mytheme <- theme_minimal() + theme(
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
panel.margin = unit(0, "lines"),
panel.border = element_rect(colour = rgb(1.0, 0, 0, 0.5), fill=NA, size=1)
)
标准地块
p + mytheme
p + mytheme + theme(strip.text = element_blank())
p + mytheme +
theme(strip.text = element_text(size = rel(3.0), vjust = -4.0))
strip.text 的 re-inclusion(以及增加的相对大小)增加了两行之间的垂直边距。所以在这一点上,我不知道如何关闭顶部和底部行之间的垂直间隙。
负边距过多p + mytheme +
theme(strip.text = element_text(size = rel(3.0), vjust = -4.0),
panel.margin = unit(c(-2, -2), "lines"))
那么如何只定位两行之间的 panel.margin?
编辑: 附加信息。行之间的 space 似乎是 strip.background
:
p + mytheme +
theme(strip.text = element_text(size = rel(3.0), vjust = -4.0),
panel.margin = unit(-1, "lines"),
strip.background = element_rect(fill = rgb(0, 1.0, 0, 0.2)))
在 theme()
的可能参数列表中,不仅有 panel.margin
("margin around facet panels (unit)",参见 ?theme
),而且为了方便,您还可以访问一个一次轴数,分别为 panel.margin.x
和 panel.margin.y
("horizontal/vertical margin around facet panels (unit; inherits from panel.margin)").
因此,虽然将边距降低到零以下感觉有点像 hack,但像下面这样的东西就可以完成这项工作(你可能需要稍微调整一下值 - unit(-2, "lines")
对我来说效果最好):
p + theme(strip.text = element_text(size = rel(3.0), vjust = -4.0),
panel.margin.y = unit(-2, "lines"))
如果您使用 strip.text = element_blank()
,那么您应该使用 panel.margin.y = unit(-0.5, "lines")
。