Как увеличить пространство между разными блоками, созданными для меток фасетов с помощью facet_nested? - PullRequest
2 голосов
/ 26 мая 2020

У меня есть следующий график:

library(ggplot2)
library(ggh4x) # remotes::install_github("teunbrand/ggh4x")

df1 <- data.frame(x = rep(1:12, times=4, each=1), 
                  y = rep((1:12)^2, times=4, each=1),
                  Variable1 = rep(c("A","B"), times=1, each=24),
                  Variable2 = rep(c("C","D"), times=4, each=12))


g<-ggplot(df1, aes(x=x, y=y)) + 
  geom_point(size=1.5) + 
  theme(strip.background = element_rect(colour = "black", fill = "white", 
                                        size = 1.5, linetype = "solid"),
        axis.title.x =element_text(margin = margin(t = 2, r = 20, b = 0, l = 0),size = 16),
        axis.title.y =element_text(margin = margin(t = 2, r = 20, b = 0, l = 0),size = 16),
        axis.text.x = element_text(angle = 0, hjust = 0.5,size = 14),
        axis.text.y = element_text(angle = 0, hjust = 0.5,size = 14),
        strip.text.x = element_text(size = 14),
        strip.text.y = element_text(size = 13),
        axis.line = element_line(),
        panel.grid.major= element_blank(),
        panel.grid.minor = element_blank(),
        legend.text=element_text(size=15),
        legend.title = element_text(size=15,face="bold"),
        legend.key=element_blank(),
        legend.position = "right",
        panel.border = element_blank(),
        strip.placement = "outside",
        strip.switch.pad.grid = unit('0.25', "cm")) + 
  facet_nested( .~Variable1 + Variable2)

g

enter image description here

Как я могу увеличить пространство между разными полями для разных меток фасетов? Так, например, я хочу увеличить пространство между A и C/D. В этом посте объясняется, как изменить расстояние между краем графика и метками фасетов (используя strip.switch.pad.grid в theme), но это не работает для разделения боксов фасетов между ними.

Кто-нибудь знаете, как это сделать?

1 Ответ

2 голосов
/ 26 мая 2020

У ggplot2 и ggh4x нет параметров для разделения полос фасетов. Однако это не означает, что это невозможно: это просто означает, что решение немного уродливее, чем вам хотелось бы. Потому что вам придется погрузиться в структуры gtable / grid под ggplot.

Для полноты; это дает тот же результат, что и ваш код.

library(ggplot2)
library(ggh4x) # remotes::install_github("teunbrand/ggh4x")
library(grid)

df1 <- data.frame(x = rep(1:12, times=4, each=1), 
                  y = rep((1:12)^2, times=4, each=1),
                  Variable1 = rep(c("A","B"), times=1, each=24),
                  Variable2 = rep(c("C","D"), times=4, each=12))



g<-ggplot(df1, aes(x=x, y=y)) + 
  geom_point(size=1.5) + 
  theme(strip.background = element_rect(colour = "black", fill = "white", 
                                        size = 1.5, linetype = "solid"),
        axis.title.x =element_text(margin = margin(t = 2, r = 20, b = 0, l = 0),size = 16),
        axis.title.y =element_text(margin = margin(t = 2, r = 20, b = 0, l = 0),size = 16),
        axis.text.x = element_text(angle = 0, hjust = 0.5,size = 14),
        axis.text.y = element_text(angle = 0, hjust = 0.5,size = 14),
        strip.text.x = element_text(size = 14),
        strip.text.y = element_text(size = 13),
        axis.line = element_line(),
        panel.grid.major= element_blank(),
        panel.grid.minor = element_blank(),
        legend.text=element_text(size=15),
        legend.title = element_text(size=15,face="bold"),
        legend.key=element_blank(),
        legend.position = "right",
        panel.border = element_blank(),
        strip.placement = "outside",
        strip.switch.pad.grid = unit('0.25', "cm")) + 
  facet_nested( .~Variable1 + Variable2)

Затем, вот дополнительные шаги, которые вам нужно будет предпринять для вашего сюжета или любого сюжета, где расположение полос является горизонтальным без вертикальных полос. Это должно работать и для обычного facet_grid().

# How much to push the boxes apart
space <- unit(0.5, "cm")

# Convert to gtable
gt <- ggplotGrob(g)

# Find strip in gtable
is_strip <- which(grepl("strip", gt$layout$name))
strip_row <- unique(gt$layout$t[is_strip])

# Change cell height
gt$heights[strip_row] <- gt$heights[strip_row] + space

# Add space to strips themselves
gt$grobs[is_strip] <- lapply(gt$grobs[is_strip], function(strip) {
  gtable::gtable_add_row_space(strip, space)
})

# Render
grid.newpage(); grid.draw(gt)

Создано 26 мая 2020 г. пакетом REPEX (v0 .3.0)

Обратите внимание, что этот пример относится к R4.0.0. Поведение grid::unit() arithmeti c может немного отличаться в предыдущих версиях R.

Кроме того, если вы просто хотите добавить отступы к тексту, проще просто обернуть текст новой строкой:

df1$Variable1 <- factor(df1$Variable1)
levels(df1$Variable1) <- paste0("\n", levels(df1$Variable1), "\n")

РЕДАКТИРОВАТЬ: Возможно, проще всего использовать элементы текстового поля ggtext:

library(ggtext) # remotes::install_github("wilkelab/ggtext")
g + theme(
  strip.background = element_blank(),
    strip.text = element_textbox_simple(
      padding = margin(5, 0, 5, 0),
      margin = margin(5, 0, 5, 0),
      size = 13,
      halign = 0.5,
      fill = "white",
      box.color = "black",
      linewidth = 1.5,
      linetype = "solid",
    )
)
g

...