首页 > 解决方案 > 如何在表达式()中包含一个保存文本的对象以用于 ggplot2 图形?

问题描述

我正在尝试将数学符号和对象与保存到它们的值结合起来,以使用 geom_text() 显示在 ggplot 图中。这是与我的问题相关的示例代码:

# values 
diff <- "0.81"
p <- "p < .01"

# approach 1) pasting in values
temp <- data.frame(condition = c("first"), value = c(2)) %>%
  mutate(test = as.character(expression(atop(beta["2"] - beta["1"] == "-0.80", "p < 0.01")))) 

ggplot() +
      geom_bar(data = temp, aes(x = condition, y = value), stat = "identity") +
      ylim(0, 5) +
      geom_text(data = temp, x = 1, y = 4, aes(label = test), size = 7, parse = TRUE) 

# approach 2) referring to objects with values
temp <- data.frame(condition = c("first"), value = c(2)) %>%
  mutate(test = as.character(expression(atop(beta["2"] - beta["1"] == diff, p))))

ggplot() +
  geom_bar(data = temp, aes(x = condition, y = value), stat = "identity") +
  ylim(0, 5) +
  geom_text(data = temp, x = 1, y = 4, aes(label = test), size = 7, parse = TRUE) 

方法 1 创建了我的目标图,但我希望能够轻松引用对象以提供在 beta 之后出现的值。如果我采用当前的方法 2,它不会使用保存到对象的值,而只是使用文本“diff”和“p”。有没有办法保持方法 1 的基本结构,但使用对象来创建我想要的图形?

标签: rggplot2expression

解决方案


我不确定当你有更多行时你想要发生什么,但如果你想部分地扩展一些变量,我认为这是最容易做到的bquote。我把它拉到一个函数中,因为让它正确矢量化可能有点棘手

mylabs <- function(diff, p) {
  sapply(mapply(function(diff, p) bquote(atop(beta["2"] - beta["1"] == .(diff), .(p))), diff, p), deparse)
}

temp <- data.frame(condition = c("first"), value = c(2)) %>%
  mutate(test = mylabs(diff, p))

推荐阅读