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

parsed labels along one facet axis, unparsed labels along the other

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

我的方向是(尝试)编写一个可以应用 label_parsed() 的自定义标签器,或者根据标签是否包含换行符而单独保留标签。对于已解析的内容,我似乎无法获得完全正确的语法。多行的当前结构,未解析的东西是

List of 1
 $ : chr [1:4] "peak\ntime" "peak\nvirulence" "equilibrium\nvirulence" "relative\npeak"

有效,但解析的内容是

List of 3
 $ :List of 1
  ..$ :  expression(beta)
 $ :List of 1
  ..$ :  expression(gamma)
 $ :List of 1
  ..$ :  expression(x[1])

这不是。将 unlist(r)unlist(r,recursive=FALSE) 应用于此结构都会给出错误消息 ...

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

?label_parsed

The return value must be a rectangular list where each 'row' characterises a single facet. The list elements can be either character vectors or lists of plotmath expressions. When multiple elements are returned, they get displayed on their own new lines (i.e., each facet gets a multi-line strip of labels).

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

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

将换行符放入标签中:

nn <- gsub(" ","\n",new_sum_labs)
fake$f1 <- factor(fake$f1,levels=orig_sum_labs,labels=nn)

我的贴标机功能:

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"

试试看:

ggplot(fake,aes(x,y))+geom_point()+
    facet_grid(f1~f2,labeller=L)

糟糕。这有点神奇(我很乐意接受清楚地解释发生了什么的答案),但我设法解决了我的问题。在我上面的标签函数中,

label_parsed(labels[[1]],multi_line=multi_line)

不起作用,但是

label_parsed(labels,multi_line=multi_line)

有效...