我想在下面的示例中使用mylabels制作带上标的刻度标签。但是,我不想手工编写代码,我希望它们达到3 ^ LEVELS,其中LEVELS是常数
library(ggplot2)
LEVELS = 4
mylabels = c(
expression(paste(3^4,"= 81")),
expression(paste(3^3,"= 27")),
expression(paste(3^2,"= 9")),
expression(paste(3^1,"= 3")),
expression(paste(3^0,"= 1")))
mylabels
length(mylabels)
df=data.frame(x=runif(40),y=(runif(40)*10)%%5)
p = ggplot(df,aes(x,y)) +
geom_point() +
scale_y_continuous(breaks = 0:LEVELS, labels = mylabels)
p
硬编码版本完美运行。但我似乎无法以编程方式获得它。以下内容:
mylabels=c(paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep=""))
在图表中没有正确评估(例如,它会在标签中写下“'表达式”等字样)。它创造了:
[1] "expression(paste(3^4,\" = 81\"))" "expression(paste(3^3,\" = 27\"))" "expression(paste(3^2,\" = 9\"))"
[4] "expression(paste(3^1,\" = 3\"))" "expression(paste(3^0,\" = 1\"))"
我想要的是:
expression(paste(3^4, "= 81"), paste(3^3, "= 27"), paste(3^2,
"= 9"), paste(3^1, "= 3"), paste(3^0, "= 1"))
与崩溃,无引号,评估,冲刺等等混淆了。
答案 0 :(得分:3)
首先需要将表达式向量构建为字符向量,然后使用parse()
解析它,它返回与输入字符向量对应的表达式向量。最好使用sprintf()
:
mylabels <- parse(text=sprintf('paste(3^%d,\' = %d\')',LEVELS:0,3^(LEVELS:0)));
mylabels;
## expression(paste(3^4,' = 81'), paste(3^3,' = 27'), paste(3^2,' = 9'),
## paste(3^1,' = 3'), paste(3^0,' = 1'))
其他提示:
1:提供取决于随机数生成的示例代码时,请在生成任意随机数之前致电set.seed()
。
2: expression()
函数是可变参数,并返回一个表达式向量,其元素对应于输入参数。因此,您可以替换
c(
expression(paste(3^4,"= 81")),
expression(paste(3^3,"= 27")),
expression(paste(3^2,"= 9")),
expression(paste(3^1,"= 3")),
expression(paste(3^0,"= 1"))
)
与
expression(
paste(3^4,"= 81"),
paste(3^3,"= 27"),
paste(3^2,"= 9"),
paste(3^1,"= 3"),
paste(3^0,"= 1")
)
3:避免对c()
进行多余调用。你可以替换
c(paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep=""))
与
paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep="")