我想在ggplot2
或plot
中使用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
对我很重要,因为我最初在轴标签中使用它,并且这些标签应该具有相同的小数位数,例如c("0.00", "0.01",...)
。许多ggplots的小数位数不同,而test
是可选变量,用于确定所需的小数位数。我将其用作“泛化”绘图的一种方式,因为不可能查看每个绘图。也许我应该添加一个更好的例子? - user5514978