У 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