使文本标签跨越多个 ggplot facet 网格窗格

Make text labels span multiple ggplot facet grid panes

如何使 geom_text_repel() 标签跨越多个 facet_grid() 窗格?例如,如果有许多长标签不适合每个网格图的适当尺寸,则应将标签定位为就好像 facet_grid() 是单个图一样。

例如:

df <- data.frame(
  x = rep(1:3, 5), 
  y = runif(15), 
  label = paste0("very long label ", 1:15), 
  group = do.call(c, lapply(paste0("group ", 1:5), function(x) rep(x, 3)))
)

library(ggplot2)
library(ggrepel)
ggplot(df, aes(x, y, label = label)) + 
  geom_point() + 
  facet_grid(cols = vars(group)) + 
  geom_text_repel()

如果有另一种方法可以在 x 轴上对样本进行分组以模拟列式小平面网格,那也很好。在我的例子中,我需要通过分组变量(相应标记)对样本进行分组,然后在每个组中通过连续变量对它们进行排序。

使用 coord_cartesian 中的 clip = "off":

library(ggplot2)
library(ggrepel)
ggplot(df, aes(x, y, label = label)) + 
  geom_point() + 
  facet_grid(cols = vars(group)) + 
  geom_text_repel() + 
  coord_cartesian(clip = "off")


如果这还不够,另一种选择是使用多线 stringr::str_wrap:

library(stringr)
library(dplyr)
df %>% 
  mutate(label_wrapped = str_wrap(label, width = 20)) %>%
  ggplot(aes(x, y, label = label_wrapped)) + 
  geom_point() + 
  facet_grid(cols = vars(group)) + 
  geom_text_repel() + 
  coord_cartesian(clip = 'off')


数据

set.seed(2)
df <- data.frame(
  x = rep(1:3, 5), 
  y = runif(15), 
  label = paste0("very very very long label ", 1:15),
  group = do.call(c, lapply(paste0("group ", 1:5), function(x) rep(x, 3)))
)