如何将 bquote 与 ggplot2 geom_label 结合使用?

How to use bquote in combination with ggplot2 geom_label?

我已阅读以下文章: https://trinkerrstuff.wordpress.com/2018/03/15/2246/

现在我正尝试在我的情节中使用 bquote 的建议方法。但是我无法让它工作。我有以下代码

x <- seq(0, 2*pi, 0.01)
y <- sin(x)
y_median <- median(y)
ggplot(mapping = aes(x = x, y = y)) + 
  geom_line() + 
  geom_label(aes(label = bquote("median" ~ y==~.y_median), x = 1, y = y_median))

我收到以下错误:

Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class ‘"formula"’ to a data.frame

我做错了什么?

ggplot 不喜欢在 geom_textgeom_label 层中处理标签表达式。它喜欢使用字符串。所以你可以做

ggplot(mapping = aes(x = x, y = y)) + 
  geom_line() + 
  annotate("text", label = deparse(bquote("median" ~ y==~.(y_median))), x = 1, y = y_median, parse=TRUE)

我们使用 deparse() 将其转换为字符串,然后使用 parse=TRUE 让 ggplot 将其解析回表达式。此外,我只是在这里使用了 annotate(),因为您根本没有真正将此值映射到您的数据。

ggplot(mapping = aes(x = x, y = y)) + 
  geom_line() + 
  geom_label(aes(label = list(bquote("median" ~ y==~.(y_median))),
                 x = 1, y = y_median), 
             parse=TRUE)

要点:

1.) 我修复了 "median" ~ y==~.(y_median) 中缺少的括号。 ?bquote 帮助页面对此进行了讨论:

‘bquote’ quotes its argument except that terms wrapped in ‘.()’ are evaluated in the specified ‘where’ environment.

2.) 将 bquote 放入列表中,因为 aes 需要向量或列表。

3.) 通过将相应的参数设置为 TRUE 告诉 geom_label 解析表达式。