R:以编程方式生成带有上标的绘图轴断点标签

时间:2016-07-26 18:47:19

标签: r plot expression axis superscript

我想在下面的示例中使用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"))

与崩溃,无引号,评估,冲刺等等混淆了。

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'))

plot

其他提示:

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="")