将数据框变量添加到 ggplot2 facet 标签

Add data frame variable to ggplot2 facet label

我想根据绘图所基于的数据将一些附加信息添加到 ggplot 绘图的刻面标签中。由于各种原因,我试图在事后执行此操作,而不是依赖对数据的临时更改。

我尝试在 label_wrap_gen 上为我的标签函数建模,我想我也可以添加一个数据框变量作为函数的参数,而不只是 label_wrap_gen 接受的固定数字。

但是,这并不像预期的那样有效。我得到的不是最左边所需的“4 (5)”,而是“4 ()”。问题似乎是 app_n 没有得到实际数据,或者类似的东西。如果不使用 .data$en(下图)而只使用 en,我会收到一个未找到变量的错误。

app_n <- function(.n) {
  fun <- function(labels) {
    labels <- label_value(labels, multi_line = TRUE)
    lapply(labels, function(x) {
      x <- paste0(x, '(', .n, ')')
      vapply(x, paste, character(1), collapse = "\n")
    })
  }
  structure(fun, class = 'labeller')
}

mtcars %>%
  group_by(cyl) %>%
    mutate(en = 5) %>%
ggplot(aes(drat, wt)) +
  facet_wrap(~ cyl, labeller = app_n(.n = .data$en))

我之所以选择这条路线,是因为在我的实际应用程序中,我试图将样本大小添加到方面标签,并且出于诸如“我想了解这是否可能”之类的原因以及“代码已经够复杂了”我先尝试走这条路

这完全可以吗? (是的,我知道这可能会导致将向量作为文本插入。虽然这对我的实际情节不起作用,但在这个阶段我很乐意得到那个结果)

通过将 .data 更改为 . 并使用 {} 让管道知道有两个数据参数。

mtcars %>%
  group_by(cyl) %>%
    mutate(en = 5) %>%
{ggplot(., aes(drat, wt)) +
  facet_wrap(~ cyl, labeller = app_n(.n = .$en))}

这 returns 预期的标签。

但是,使用数据框变量本身来标记您的构面意味着构面与行一样多。否则仅使用前几个标签并返回警告。