更改 facet_wrap() 条带位置以将小平面条带放置在绘图内

Change facet_wrap() strip positions to place facet strips inside plot

如何更改 facet_wrap() 条带位置,如下图所示?
数据框来自 问题。
enter image description here

实现您想要的结果的一个选项是通过 gggrid 包。与 ggplot2::annotation_custom 类似,它允许将 grobs 添加到 ggplot,但提供了更大的灵活性,例如您可以在每个面板上放置不同的 grob。此外,它允许访问引擎盖下由 ggplot2 创建的 datacoords 对象,并允许传递额外的美学。

基本上它需要一个函数来创建 grob,然后通过 gggrid::grid_panel 添加到 ggplot。对于 grob,我使用 gridtext::richtext_grob 这样可以很容易地向每个面板添加像文本框这样的条形文本。

library(ggplot2)
library(gggrid)
#> Loading required package: grid
library(gridtext)

set.seed(123)

ID <- rep(c("ABC123", "DEF456", "GHI789", "JKL012"), each = 10)
Vref <- c((runif(10, 1, 2)), (runif(10, 3, 5)), (runif(10, 6, 9)), (runif(10, 0, 2)))
Time <- rep(c(1:10), 4)
df <- data.frame(ID, Vref, Time)

tg <- function(data, coords) {
  y_label <- max(coords$y) 
  gridtext::richtext_grob(data$label[which.max(coords$y)],
    x = unit(0, "npc")  + unit(.045, "npc"),
    y = unit(y_label, "npc") + unit(2, "mm"),
    hjust = 0,
    vjust = 0,
    valign = .5,
    padding = unit(rep(4.4, 4), "pt"),
    gp = grid::gpar(fontsize = 8, fill = "grey85"),
    box_gp = grid::gpar(col = "grey85")
  )
}

ggplot(df, aes(x = Time, y = Vref)) +
  geom_col() +
  scale_y_continuous(expand = expansion(mult = c(.05, .2))) +
  facet_wrap(~ID, nrow = 2) +
  gggrid::grid_panel(mapping = aes(label = ID), tg) +
  theme(strip.text = element_blank())