在R中将表达式与sprintf结果结合起来用于ggplot/绘图标签

3

我想在ggplot2plot中使用sprintf结果结合expression来进行标注。

因此,我尝试了以下代码 (这只是为了说明问题而无意义的示例):

require(ggplot2)
test <- 2
ggplot(data = iris, aes(x = Sepal.Length)) +
  geom_bar() +
  scale_x_continuous(name = expression(""<=sprintf(paste0("%.", test, "f"), pi)))

显然,这样不起作用(只是评估<=pi),即使两个单独的元素确实有效。有没有可能重写表达式,使其与组合一起使用?我已经尝试包含~eval(parse(text = ...)),但这些也不起作用。最后:对我来说,将test对象集成到sprintf中非常重要。
提前感谢!
编辑: 这里有一个更好的例子。我认为我尽可能地让它变得简单明了,但显然不够具体。对此感到抱歉。希望现在可以理解我的问题。谢谢!
require(ggplot2)
require(scales)

# data
ids <- factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3"))
values <- data.frame(id = ids,
                 value = c(3, 3.1, 3.1, 3.2, 3.15, 3.5))
positions <- data.frame(id = rep(ids, each = 4),
                    x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
                          0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
                    y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
                          2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2))
datapoly <- merge(values, positions, by = c("id"))

# plot preperation (for many ggplots is especially decimals output of a function)
decimals <- 2
lim_min <- 3.1
lim_max <- 3.4
breaks <- seq(lim_min, lim_max, (lim_max - lim_min)/4)
labels <- c(paste0("<", sprintf(paste0("%.", decimals, "f"), breaks[1])),
        sprintf(paste0("%.", decimals, "f"), breaks[2]),
        sprintf(paste0("%.", decimals, "f"), breaks[3]),
        sprintf(paste0("%.", decimals, "f"), breaks[4]),
        paste0(">", sprintf(paste0("%.", decimals, "f"), breaks[5])))

# plot
ggplot(datapoly, aes(x = x, y = y)) +
  geom_polygon(aes(fill = value, group = id)) +
  scale_fill_gradient(limits = c(3.1, 3.4),
                  low = "green", high = "orange",
                  breaks = breaks,
                  labels = labels,
                  oob = squish)

现在坐标轴刻度标签为 "<3.10" "3.17" "3.25" "3.33" ">3.40",我希望显示为"<=3.10" "3.17" "3.25" "3.33" ">=3.40",用数学符号代替 >=<=,类似于此处此处的符号。请注意不要删除任何HTML标记。

你想要显示的表达式是什么?为什么sprintf很重要?(相对于bquote或substitute而言)? - baptiste
我想要显示的表达式是上面那个。我认为sprintf对我很重要,因为我最初在轴标签中使用它,并且这些标签应该具有相同的小数位数,例如c("0.00", "0.01",...)。许多ggplots的小数位数不同,而test是可选变量,用于确定所需的小数位数。我将其用作“泛化”绘图的一种方式,因为不可能查看每个绘图。也许我应该添加一个更好的例子? - user5514978
2个回答

3

在baptiste的提示下,我自己找到了一个解决方案,使用substitute函数进行更改。

labels <- c(substitute(""<=a, list(a =sprintf(paste0("%.", decimals, "f"), breaks[1]))),
            sprintf(paste0("%.", decimals, "f"), breaks[2]),
            sprintf(paste0("%.", decimals, "f"), breaks[3]),
            sprintf(paste0("%.", decimals, "f"), breaks[4]),
            substitute("">=a, list(a =sprintf(paste0("%.", decimals, "f"), breaks[5]))))

在上面的后一个例子中,结果满足了我的需求!谢谢!

1
这是您寻找的内容吗?
out <- sprintf(paste0("%.", test, "f"), pi)
ggplot(data = iris, aes(x = Sepal.Length)) +
  geom_bar() +
  scale_x_continuous(name = paste(expression("<="), out))

enter image description here


但是我会失去“小于或等于”的数学符号吗? - user5514978
你说的“losing the math”是什么意思?scale_x_continuous(name)参数只提供坐标轴标签。请编辑问题以显示您想要实现的内容。 - Adam Quek
我的意思是,我想要像这个这个这样的数学符号,而不是<=>=。我编辑了问题并添加了一个更好的例子。对此我很抱歉。 - user5514978

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接