沿一个面轴解析标签,沿另一个面轴未解析标签

Ben*_*ker 5 r facet ggplot2

我试图找到一个方便的解决方案,以解决一个场景维度的多行纯文本标签和另一个分面维度的 plotmath 样式数学表达式。多行条带标签的各种解决方案(例如这里)对我来说有点笨重;我有因子标签,snake_case并希望能够以编程方式将它们全部转换为多行版本而不会陷入substitute(bquote(parse(...))地狱(尽管也可以接受沿着这些方向的解决方案)。

我的方向是(尝试)编写一个自定义label_parsed()标签器,根据标签是否包含换行符来应用或保留标签。我似乎无法为解析的内容获得非常正确的语法。多行,未解析的东西的当前结构是

List of 1
 $ : chr [1:4] "peak\ntime" "peak\nvirulence" "equilibrium\nvirulence" "relative\npeak"
Run Code Online (Sandbox Code Playgroud)

哪个有效,但解析的东西是

List of 3
 $ :List of 1
  ..$ :  expression(beta)
 $ :List of 1
  ..$ :  expression(gamma)
 $ :List of 1
  ..$ :  expression(x[1])
Run Code Online (Sandbox Code Playgroud)

哪个没有。应用unlist(r)unlist(r,recursive=FALSE)到这个结构都给出错误信息......

结果(如下所示)是所有三个解析的标签都堆积在第一列中......

?label_parsed

返回值必须是一个矩形列表,其中每个“行”表征一个方面。列表元素可以是字符向量或 plotmath 表达式列表。当返回多个元素时,它们会显示在自己的新行上(即,每个方面都有一个多行标签条)。

设置:加载包,定义新旧标签

library(ggplot2); theme_set(theme_bw())
orig_sum_labs <- c("peak_time","peak_vir","eq_vir","rel_peak")
new_sum_labs <- c("peak time","peak virulence","equilibrium virulence",
                  "relative peak")
fake <- data.frame(f1=rep(orig_sum_labs,each=12),
                   f2=factor(rep(1:3,16),levels=1:3,
                             labels=c("beta","gamma","x[1]")),
                   x=rep(1:4,12),y=rep(1:4,12))
Run Code Online (Sandbox Code Playgroud)

将换行符放入标签:

nn <- gsub(" ","\n",new_sum_labs)
fake$f1 <- factor(fake$f1,levels=orig_sum_labs,labels=nn)
Run Code Online (Sandbox Code Playgroud)

我的贴标机功能:

L <- function(labels,multi_line=TRUE) {
    r <- if (all(grepl("\n",labels[[1]]))) {
        list(as.character(labels[[1]]))
    } else {
        label_parsed(labels[[1]],multi_line=multi_line)
    }
    ## browser()
    return(r)
}
class(L) <- "labeller"
Run Code Online (Sandbox Code Playgroud)

试试看:

ggplot(fake,aes(x,y))+geom_point()+
    facet_grid(f1~f2,labeller=L)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Ben*_*ker 3

哎呀。这有点神奇(我很乐意接受清楚解释发生了什么的答案),但我设法解决了我的问题。在我上面的贴标机功能中,

label_parsed(labels[[1]],multi_line=multi_line)
Run Code Online (Sandbox Code Playgroud)

不起作用,但是

label_parsed(labels,multi_line=multi_line)
Run Code Online (Sandbox Code Playgroud)

作品...

在此输入图像描述