在绘图标签中组合paste()和expression()函数

Aar*_*ron 62 plot r

考虑这个简单的例子:

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

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

有什么想法吗?

Rei*_*son 64

@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)
Run Code Online (Sandbox Code Playgroud)

(注意,~只是添加一些间距,如果你不想要空格,用它替换它,*并且表达式的两个部分将是并置的.)

  • 更多示例:https://www.r-bloggers.com/2018/03/math-notation-for-r-plot-titles-expression-and-bquote/ (3认同)
  • @timing 我不知道,但我发现 `bquote()` 语法不太冗长,它允许您使用表达式,而不是字符串 (2认同)

Aar*_*ica 26

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])))
Run Code Online (Sandbox Code Playgroud)

  • 你们是双胞胎吗?=) (17认同)

s_s*_*ary 22

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

有关R中的不同数学运算,请参阅?plotmath

你应该能够使用没有粘贴的表达式.如果在表达式函数中使用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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

希望您可以看到图1,2和3之间的差异与〜和*符号的不同用法.额外注意事项,您可以使用其他符号,例如绘制温度为mu或phi的度数符号.如果要添加下标,请使用方括号.

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

在此输入图像描述

这是一个ggplot示例,使用带有无意义示例的表达式

require(ggplot2)
Run Code Online (Sandbox Code Playgroud)

或者,如果安装了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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 虽然 matplotlib 的一个精心设计的示例,但这个答案实际上不允许将字符向量中的值替换到轴中。你的例子的介绍让我觉得它对 ggplot 会有帮助,但这里的其他答案更有帮助。 (2认同)

小智 7

非常好的示例使用粘贴和替换来排版符号(mathplot)和变量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)
Run Code Online (Sandbox Code Playgroud)


dan*_*eck 6

如果 x^2 和 y^2 是变量 squared 中已经给出的表达式,则可以解决问题:

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)
Run Code Online (Sandbox Code Playgroud)

请注意squared[1]后面的[[1]]。它为您提供括号之间的“表达式(...)”的内容,没有任何转义字符。