ggplot2 带有数学符号的自定义构面标记器

Tyl*_*ker 5 r ggplot2

我想创建自己的贴标函数来获取构面标签的输入,将其转换为包含数学符号的字符串,然后让 ggplot 解析它。我知道我可以更改底层数据并使用label_parsed,但希望能够创建其他人可以使用的易于通用的函数。这还允许人们保持数据原样(包括正确的因子水平)并仅交换标签。否则,您需要改变基础数据,然后添加正确的因子级别,以便正确完成排序。

阅读http://ggplot2.tidyverse.org/reference/labeller.html后,这是我尝试过的。

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

在此输入图像描述

所以我想知道它是label_parsed做什么的?

> label_parsed(1:3)
[[1]]
[[1]][[1]]
expression(1)


[[2]]
[[2]][[1]]
expression(2)


[[3]]
[[3]][[1]]
expression(3)
Run Code Online (Sandbox Code Playgroud)

表达式列表的列表。所以我尝试:

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

在此输入图像描述

label_parsed如果我将其变成一个函数,也会发生类似的想法:

ggplot(mtcars, aes(mpg, disp)) +
    geom_point() +
    facet_grid( ~ am, 
        labeller = labeller(am = function(x) label_parsed(x))
    )
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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