将两个边距都添加到facet_grid中,但不添加组合

时间:2018-12-05 13:00:14

标签: r ggplot2 facet-grid

我想同时显示右边距和底部边距,但不能同时显示两者的组合。 facet_grid有可能吗?

library(ggplot2)

ggplot(mtcars, aes(x = hp, group = vs)) + 
  geom_density() + 
  facet_grid(am ~ vs, switch = "y", margins = TRUE) 

我试图通过手动为margin参数提供因子来解决此问题,但这无济于事。另外,R文档也无济于事。

当前结果

The current outcome

所需结果

The desired outcome

2 个答案:

答案 0 :(得分:6)

这样的事情对我来说是一个错误,因为我看不到大图gt中的条目与最终形式的关系:

library(ggplot2)

p<-
ggplot(mtcars, aes(x = hp, group = vs)) + 
    geom_density() + 
    facet_grid(am ~ vs, switch = "y", margins = TRUE)

gt = ggplotGrob(p)

keep <- !grepl("[3br]-3$",gt$layout$name)

gt$layout <- gt$layout[keep,]
gt$grobs  <- gt$grobs[keep]

plot(gt)

enter image description here

答案 1 :(得分:2)

ggplot2使用固定的惯用语来命名关键图解元素,因此我们可以使用确定性条件来查找元素:

library(ggplot2)

ggplot(mtcars, aes(x = hp, group = vs)) + 
  geom_density() + 
  facet_grid(am ~ vs, switch = "y", margins = TRUE) -> gg

将图构建为gtable对象:

gt <- ggplot_gtable(ggplot_build(gg))

获取表格单元格名称:

cells <- gt$layout$name

弄清楚哪个是底角面板和轴:

apply(
  apply(
    do.call(rbind, strsplit(grep("panel", cells, value=TRUE), "-"))[,2:3],
    2, as.integer), 
  2, max
) -> max_col_row

bottom_right_panel <- paste0(c("panel", max_col_row), collapse="-")
bottom_axis <- sprintf("axis-b-%s", max_col_row[2])

找出哪些不是底角面板:

paste0(
  grep(sprintf("^%s|%s$", bottom_corner, bottom_axis), cells, value=TRUE, invert = TRUE),
  collapse = "|"
) -> not_bottom_corner_panel

只画那些:

grid::grid.draw(
  gtable::gtable_filter(gt, sprintf("^(%s)$", not_bottom_corner_panel))
)