在plot标签中结合paste()和expression()函数

考虑这个简单的例子:

labNames <- c('xLab','yLabl') plot(c(1:10),xlab=expression(paste(labName[1], x^2)),ylab=expression(paste(labName[2], y^2))) 

我想要的是由variables“labName”,“xLab”或“yLab”定义的字符条目出现在由expression式()定义的X ^ 2或y ^ 2旁边。 实际上,带有下标的实际文本“labName”被连接到上标expression式。

有什么想法吗?

@Aaron的替代解决scheme是bquote()函数。 我们需要提供一个有效的Rexpression式,例如labNames LABEL ~ x^2 ,其中LABEL是要从vectorlabNames分配的string。 bquote评估包含在.( )的expression式中的R代码,并将结果bquote为expression式。

这里是一个例子:

 labNames <- c('xLab','yLab') xlab <- bquote(.(labNames[1]) ~ x^2) ylab <- bquote(.(labNames[2]) ~ y^2) plot(c(1:10), xlab = xlab, ylab = ylab) 

(注意~只是增加一点间距,如果你不想要空格,用*代替它,expression式的两个部分将并列)。

使用substitute

 labNames <- c('xLab','yLab') plot(c(1:10), xlab=substitute(paste(nn, x^2), list(nn=labNames[1])), ylab=substitute(paste(nn, y^2), list(nn=labNames[2]))) 

你应该能够使用expression式而不粘贴。 如果在expression式函数中使用tilda(〜)符号,它将假定字符之间有一个空格,或者可以使用*符号,并且不会在参数之间放置空格

有时你需要改变你在y轴上的上标的边距。

 par(mar=c(5, 4.3, 4, 2) + 0.1) plot(c(1:10), xlab = expression(xLab ~ x^2 ~ m^-2), ylab = expression(yLab ~ y^2 ~ m^-2), main="Plot 1") 

在这里输入图像描述

 plot(c(1:10), xlab = expression(xLab * x^2 * m^-2), ylab = expression(yLab * y^2 * m^-2), main="Plot 2") 

在这里输入图像描述

 plot(c(1:10), xlab = expression(xLab ~ x^2 * m^-2), ylab = expression(yLab ~ y^2 * m^-2), main="Plot 3") 

在这里输入图像描述

希望你能看到图1,图2和图3与〜和*符号的不同用法之间的区别。 一个额外的笔记,你可以使用其他符号,如绘制温度为或亩,phi度符号。 如果你想添加一个下标使用方括号。

 plot(c(1:10), xlab = expression('Your x label' ~ mu[3] * phi), ylab = expression("Temperature (" * degree * C *")")) 

在这里输入图像描述

非常好的例子使用粘贴和替代排版符号(mathplot)和variables在http://vis.supstat.com/2013/04/mathematical-annotation-in-r/

这是一个ggplot适应

 library(ggplot2) x_mean <- 1.5 x_sd <- 1.2 N <- 500 n <- ggplot(data.frame(x <- rnorm(N, x_mean, x_sd)),aes(x=x)) + geom_bar() + stat_bin() + labs(title=substitute(paste( "Histogram of random data with ", mu,"=",m,", ", sigma^2,"=",s2,", ", "draws = ", numdraws,", ", bar(x),"=",xbar,", ", s^2,"=",sde), list(m=x_mean,xbar=mean(x),s2=x_sd^2,sde=var(x),numdraws=N))) print(n) 

如果x ^ 2和y ^ 2是variables平方已经给出的expression式,则解决了这个问题:

 labNames <- c('xLab','yLab') squared <- c(expression('x'^2), expression('y'^2)) xlab <- eval(bquote(expression(.(labNames[1]) ~ .(squared[1][[1]])))) ylab <- eval(bquote(expression(.(labNames[2]) ~ .(squared[2][[1]])))) plot(c(1:10), xlab = xlab, ylab = ylab) 

请注意背后[1]的[[1]]。 它给你的括号之间的“expression式(…)”的内容没有任何转义字符。