В ggplot2 и facet_wrap, как удалить все поля и отступы, сохраните 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())

no strip text

Добавление strip.text и вставка его
p + mytheme +
     theme(strip.text = element_text(size = rel(3.0), vjust = -4.0))

текст вставки тестовой сетки

Повторное включение strip.text(и увеличенного относительного размера) увеличивает вертикальный край между двумя строками. Поэтому в этот момент я не знаю, как закрыть вертикальный зазор между верхним и нижним рядами.

Слишком большая отрицательная маржа
p + mytheme +
    theme(strip.text = element_text(size = rel(3.0), vjust = -4.0), 
          panel.margin = unit(c(-2, -2), "lines"))

Слишком много отрицательного поля

Итак, как мне настроить таргетинг только на панель .margin между двумя строками?

Изменить: Дополнительная информация. Пространство между строками выглядит как 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)))

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

Ответ 1

Среди списка возможных аргументов theme() есть не только panel.margin ( "margin around facet panels (unit)", см. ?theme), но удобно, вы также можете получить доступ к одной из осей за раз, с panel.margin.x и panel.margin.y соответственно ( "горизонтальное/вертикальное поле вокруг панелей фасетов (unit; inherits from panel.margin)" )).

Поэтому, уменьшая маржу ниже нуля, она немного похожа на взлома, что-то вроде следующего выполнит работу (возможно, вам придется немного изменить значение - 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").