R ggplot2带数学符号的自定义刻面贴标机

R ggplot2带数学符号的自定义刻面贴标机,r,ggplot2,R,Ggplot2,我想创建我自己的labeller函数来获取facet标签的输入,将其转换为包含数学符号的字符串,然后让ggplot解析它。我知道我可以更改基础数据并使用label\u parsed,但我希望能够获得其他人可以使用的易于推广的函数。这也允许人们保持数据的原样(包括正确的因子水平),只需交换标签。否则,您需要改变基础数据,然后添加正确的因子级别,以便正确地进行排序 看完后,这里是我尝试过的 library(ggplot2) ## can be used with label_parsed but

我想创建我自己的labeller函数来获取facet标签的输入,将其转换为包含数学符号的字符串,然后让ggplot解析它。我知道我可以更改基础数据并使用
label\u parsed
,但我希望能够获得其他人可以使用的易于推广的函数。这也允许人们保持数据的原样(包括正确的因子水平),只需交换标签。否则,您需要改变基础数据,然后添加正确的因子级别,以便正确地进行排序

看完后,这里是我尝试过的

library(ggplot2)

## can be used with label_parsed but order not retained
mtcars$mpg2 <- ifelse(mtcars$mpg > 20, 'beta', 'alpha')
## can be used with label_parsed and retains levels (but this is 2 steps)
mtcars$mpg3 <- factor(mtcars$mpg2, levels = c('beta', 'alpha'))

ggplot(mtcars, aes(mpg, disp)) +
    geom_point() +
    facet_grid(mpg3 ~ mpg2, 
        labeller = label_parsed
    )

## attempt #1 at a function
label_as_notation <- function(x, ...){
    parse(text = paste('"X:" ~ ', x, '<=', ifelse(x == 0, 'omega', 'psi')))
}

ggplot(mtcars, aes(mpg, disp)) +
    geom_point() +
    facet_grid( ~ am, 
        labeller = labeller(am = label_as_notation)
    )
表达式列表的列表。所以我试着:

label_as_notation2 <- function(x, ...){

    y <- unlist(x)

    lapply(x, function(y) { 
        lapply(y, function(z) {
            parse(text = paste('"X:" ~ ', z, '<=', ifelse(z == 0, 'omega', 'psi')))
        })
    })
}

ggplot(mtcars, aes(mpg, disp)) +
    geom_point() +
    facet_grid( ~ am, 
        labeller = labeller(am = label_as_notation2)
    )

所以我想我的第二种方法不起作用也就不足为奇了。我尝试了
作为_labeller
包装返回字符但不解析的函数


我如何制作一个通用的标签机,它可以动态切换带有数学概念的标签,以便ggplot2能够正确解析它们?

bquote
函数与
plotmath
(grDevices)结合起来满足您的需要?这种方法可以
label\u as_notation@rawr为什么(除了不将
X
带到两个点之外)?以我有限的知识,我可能不理解你的问题。请允许我问一下,您为什么说必须对数据帧进行变异才能解析标签?关于,我们可以简单地在
facet()
调用中创建因子:
..+facet\u wrap(~factor(物种,等级=c('setosa','versicolor','virginica'),labels=c('setosa','versicolor','NULL^14*c~氨基酸')),labeller=label\u解析)
=>无数据帧突变@Tjebo我不是在为自己寻找这个,而是将它打包,让其他人可以轻松使用。在我看来,想要(1)改变标签和(2)解析标签应该是对解析器函数的简单调用。你的方法,就像分析数据一样,需要更大的技术提升,我不想对我的用户这样做。
label_as_notation2 <- function(x, ...){

    y <- unlist(x)

    lapply(x, function(y) { 
        lapply(y, function(z) {
            parse(text = paste('"X:" ~ ', z, '<=', ifelse(z == 0, 'omega', 'psi')))
        })
    })
}

ggplot(mtcars, aes(mpg, disp)) +
    geom_point() +
    facet_grid( ~ am, 
        labeller = labeller(am = label_as_notation2)
    )
ggplot(mtcars, aes(mpg, disp)) +
    geom_point() +
    facet_grid( ~ am, 
        labeller = labeller(am = function(x) label_parsed(x))
    )