在绘图标签中组合粘贴()和表达()函数

考虑一下这个简单的例子:

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

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

有什么想法吗?

151373 次浏览

使用 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])))

与@Aaron 相比,另一种解决方案是 bquote()函数。我们需要提供一个有效的 R 表达式,例如在本例中是 LABEL ~ x^2,其中 LABEL是要从向量 labNames分配的字符串。bquote计算 .( )中包装的表达式中的 R 代码,并将结果替换为表达式。

这里有一个例子:

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

(注意,~只是增加了一点间距,如果你不想要这个空间,就用 *代替它,这样表达式的两个部分就会并列在一起。)

非常好的例子,使用粘贴和替代,以排版两个符号(数学图)和变量在 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)

编辑: 最后为 ggplot2添加了一个新示例

有关 R 中的不同数学运算,请参见 ? plotath

您应该能够使用不粘贴的表达式。如果在表达式函数中使用 tilda (~)符号,它会假设字符之间有空格,或者可以使用 * 符号,它不会在参数之间放置空格

有时候你需要改变 Y 轴上的上标的边距。

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

enter image description here

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

enter image description here

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

enter image description here

希望您能够通过 ~ 和 * 符号的不同用法看到图1、2和3之间的区别。另外,还可以使用其他符号,例如绘制表示温度的度数符号,或者 μ,φ。如果要添加下标,请使用方括号。

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

enter image description here

下面是一个 ggplot 示例,它使用了带有无意义示例的表达式

require(ggplot2)

或者,如果已经安装了 pacman 库,则可以使用 p _ load 自动下载、加载和附加附加包

# require(pacman)
# p_load(ggplot2)


data = data.frame(x = 1:10, y = 1:10)


ggplot(data, aes(x,y)) + geom_point() +
xlab(expression(bar(yourUnits) ~ g ~ m^-2 ~ OR ~ integral(f(x)*dx, a,b))) +
ylab(expression("Biomass (g per" ~ m^3 *")")) + theme_bw()

enter image description here

如果 x ^ 2和 y ^ 2是已经在变量平方中给出的表达式,这就解决了问题:

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 (...)”的内容。