Добавьте оба поля в 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 мне не помогает.

Текущий результат

Текущий результат

Желаемый результат

Желаемый результат


person Michiel uit het Broek    schedule 05.12.2018    source источник


Ответы (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))
)
person hrbrmstr    schedule 05.12.2018
comment
ваше решение по-прежнему сохраняет метки оси x + галочки в правом нижнем углу, что нежелательно. Меббе я ошибаюсь. - person Andre Elrico; 05.12.2018
comment
Спасибо. фиксированный. он по-прежнему детерминирован :-) Это также помогло сделать примерный код менее запутанным лабиринтом в скобках. - person hrbrmstr; 05.12.2018
comment
Я обновил свое предложение методом проб и ошибок, сделав его более содержательным. - person Andre Elrico; 05.12.2018
comment
И в ответ на предположение ставится галочка. Да, SO, определенно, находится в упадке. - person hrbrmstr; 05.12.2018

для меня такие вещи являются пробной ошибкой, поскольку я не вижу больших изображений того, как записи в 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)

введите описание изображения здесь

person Andre Elrico    schedule 05.12.2018