【问题标题】:Add data frame variable to ggplot2 facet label将数据框变量添加到 ggplot2 构面标签
【发布时间】:2020-12-10 11:58:41
【问题描述】:

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

我试图在 label_wrap_gen 上对我的贴标机函数进行建模,认为我不妨将数据框变量作为参数添加到函数中,而不是 label_wrap_gen 采用的固定数字。

但是,这并没有按预期工作。我得到的不是最左边的“4 (5)”,而是“4 ()”。问题似乎是app_n 没有获取实际数据,或者类似的东西。如果只使用en 而不是.data$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))

我采取这条路线的原因是,在我的实际应用程序中,我试图将样本大小添加到构面标签中,并且出于“我想了解这是否可能”以及“代码已经够复杂了”我首先尝试走这条路。

这可以工作吗? (是的,我知道这可能会导致向量作为文本插入。虽然这不适用于我的实际绘图,但在这个阶段我很乐意得到这个结果)

【问题讨论】:

    标签: r ggplot2 facet


    【解决方案1】:

    可以通过将.data 更改为. 并使用{} 让管道知道有两个数据参数,可以将en 列传递给您的标签函数。

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

    这将返回预期的标签。

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

    【讨论】:

    • 哦,我完全忘记了点选项!谢谢提醒。事实上,一旦这工作,我也已经预料到它不会按预期工作,因为你提到的方面与行错位。现在至少我知道如何让它工作了:)
    猜你喜欢
    • 2020-10-24
    • 2023-03-31
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多