【问题标题】:R: creating vectors of latin/greek expression for plot titles, axis labels, or legendsR:为绘图标题、轴标签或图例创建拉丁/希腊表达式向量
【发布时间】:2012-10-21 13:58:50
【问题描述】:

我想合并拉丁文和希腊文文本的向量以生成绘图标题、轴标签、图例条目等。我在下面提供了一个简单的示例。我无法弄清楚如何以原生形式呈现希腊字母。我已经尝试了 expressionparseapplypaste 命令的各种组合,但我无法对可以轻松生成混合拉丁语/希腊语文本的代码进行矢量化处理(例如,expression("A ("*alpha*")") 适用于单个表达式)。

data<-matrix(seq(20),nrow=5,ncol=4,byrow=TRUE)
colnames(data)<-c("A","B","C","D")
greek<-c(" (alpha)"," (beta)"," (gamma)"," (delta)")
matplot(data)
legend(1,max(data),fill=c("black","red","green","blue"),apply(matrix(paste(colnames(data),greek,sep=""),nrow=4,ncol=1),1,expression))

您能帮我处理legend() 语句中的apply() 语句吗?它需要一些修改才能产生所需的输出(即 A (α)、B(β)、C(γ)、D(δ))。提前致谢。

【问题讨论】:

    标签: r plot special-characters legend tex


    【解决方案1】:

    不要使用apply 创建表达式向量。

    改为使用parse(text = ...)

    .expressions <- paste(colnames(data),greek,sep="")
    legend_expressions <-parse(text = .expressions)
    
    matplot(data)
    legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)
    

    如果您想在表达式中包含~。鉴于您当前的工作流程,在对 paste 的调用中将 sep = '' 替换为 sep = '~' 似乎最容易

    .expressions <- paste(colnames(data),greek,sep="~")
    legend_expressions <-parse(text = .expressions)
    
    matplot(data)
    legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)
    

    使用sprintf 形成将成为您的表达向量的字符串可能会更清楚。

    如果要包含包含空格的字符串,则需要将这些字符串用引号引起来。例如。

    greek <- c("alpha", "beta", "gamma", "delta")
    other_stuff <- c('hello world','again this','and again','hello')
    
    .expressions <- mapply(sprintf, colnames(data), other_stuff, greek, 
                           MoreArgs = list(fmt = '"%s %s"~(%s)'))
    
    .expressions  
    ##                           A                           B                           C                           D 
    ## "\"A hello world\"~(alpha)"   "\"B again this\"~(beta)"   "\"C and again\"~(gamma)"       "\"D hello\"~(delta)" 
    
     legend_expressions <-parse(text = .expressions)
    
    matplot(data)
    legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)
    

    【讨论】:

    • 感谢您提供非常有用的解决方案。您能告诉我如何在不明确使用~ 字符的情况下将空格合并到标签中吗?例如,将colnames(data) 重新定义为c("A~a","B~b","C~c","D~d") 是可以接受的,而重新定义为c("A a","B b","C c","D d") 则不是(使用后一个定义在执行parse 语句时会出现unexpected symbol 错误)。也许如果我不想要列名中的波浪号字符,我应该使用字符串替换函数在 parse 语句之前用波浪号替换所有空格?
    • 谢谢@mnel。我希望能够在colnames 中包含空格(例如,“A a”而不是“A”)。但是,当colnames 包含空格时,parse 语句将失败。如果空格被替换为波浪号(例如,“A~a”而不是“A a”),则parse 语句不再失败。使用~ 作为paste 中的sep 仍然不适用于带有“A a”之类空格的colname
    • 没有空格的列名是非语法的,因此尝试将这些设置为matrixdata.frame 的列名不是一个好主意。我认为我的mapply(sprintf,...) 解决方案将是最容易实现的。
    • 让它们与表达式一起工作的技巧是将它们用引号括在字符串中。现在已经实现了
    • 啊,在提交解析之前包括字符串中的引号——好主意。我发现了另一个问题:如果我希望其中一个标签缺少希腊字母怎么办?将 greek 更改为 c("", "beta", "gamma", "delta") 会导致代码再次失败。你知道如何解决这个问题吗?
    【解决方案2】:

    这是一种避免parse() 的替代方法,并适用于您对@mnel 的好答案的第一条评论中提到的示例:

    greek <- c("alpha", "beta", "gamma", "delta")
    cnames <- paste(LETTERS[1:4], letters[1:4])
    
    legend_expressions <- 
    sapply(1:4, function(i) {
        as.expression(substitute(A (B), 
                      list(A = as.name(cnames[i]), B = as.name(greek[i]))))
    })
    
    matplot(data)
    legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)
    

    【讨论】:

    • 谢谢,乔希。您的解决方案对于不同的输入非常强大。您能解释一下为什么A (B)A*BA~Bsubstitute 语句中起作用,而A B 则不起作用?您能否为新用户评论一下为什么需要as. 语法?我读到substitute 返回一个未计算的表达式,因此使用as.expressionsubstitute 的输出进行操作是有意义的。 as.name 呢?
    • @user001 -- 您可能知道,“R 语言定义”的this section 是了解 R 语言元素以及如何操作它们的良好起点。 substitute() 可以将任何语法上有效的语句作为其第一个参数。 A B 不是“允许的”,因为它在语法上是有效的。 (你能想到在命令行输入的任何 R 语句都具有这种形式吗?我不认为!)。
    • @user001 -- substitute()一般返回类“表达式”的对象。 (请参阅?substitute 的“值”部分,并使用class(substitute()) 来了解我的意思:class(substitute(x)); class(substitute(x(y))); class(substitute({x; y})); class(substitute(expression(x))) 等)我使用as.expression() 来强制whatever返回一个表达对象。表达式是一种向量,所以sapply() 只是将几个长度为 1 的表达式连接成一个长度为 4 的表达式向量。请参阅?as.name 了解as.name()。希望这会有所帮助!
    • 感谢您的补充说明。我最终决定选择您的答案,因为它对输入格式的变化最不敏感(例如,在字符串中添加空格)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 2014-11-10
    • 2013-04-03
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多