【问题标题】:Combining paste() and expression() functions in plot labels在绘图标签中结合 paste() 和 expression() 函数
【发布时间】:2011-06-25 19:48:08
【问题描述】:

考虑这个简单的例子:

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' 出现在由 expression() 定义的 X^2 或 y^2 旁边。实际上,带有下标的实际文本“labName”连接到上标表达式。

有什么想法吗?

【问题讨论】:

    标签: r plot


    【解决方案1】:

    请改用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])))
    

    【讨论】:

      【解决方案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)
      

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

      【讨论】:

      • 想知道为什么这个答案被选中/获得了比替代解决方案更多的支持?我认为比 bquote 熟悉替代品的人更多
      • @timing 我不知道,但我发现bquote() 语法不那么冗长,它允许您使用表达式,而不是字符串
      【解决方案3】:

      使用粘贴和替换来排版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)
      

      【讨论】:

      • 不错。这太疯狂了,但这是我能够开始工作的唯一方法!这是一个将 unicode 符号与表达式结合的示例! title = substitute(paste("n = ", n, ", ", bar(x), " = ", mu, ", ", "\u03C3/\u221An = ", se), list(n = df[["n"]], mu = format(df[["mu"]], digits = 2, nsmall = 2), se = format(df[["se"]], digits = 2, nsmall = 2), sep = "")),其中df 是保存要打印的值的数据框(样本大小n,样本均值mu 和标准误差se)。哇。
      【解决方案4】:

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

      请参阅 ?plotmath 了解 R 中的不同数学运算

      您应该能够在不粘贴的情况下使用表达式。如果您在表达式函数中使用 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")
      

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

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

      希望您可以通过 ~ 和 * 符号的不同用途看到图 1、2 和 3 之间的差异。额外说明一下,您可以使用其他符号,例如为温度或 mu、phi 绘制度数符号。如果要添加下标,请使用方括号。

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

      这是一个 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()
      

      【讨论】:

      • 我已经开始使用 ggplot 作为我的主要绘图工具,这种方法也适用于 ggplot
      • 虽然是 matplotlib 的一个很好的例子,但这个答案实际上并不允许将字符向量中的值替换到轴中。你的例子的介绍给了我一个想法,它对 ggplot 有帮助,但这里的其他答案更有帮助。
      【解决方案5】:

      如果 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)
      

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

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多