我正在尝试为以下情况找到一种方便的解决方案:对于一个构面维度,我具有多行纯文本标签,而对于另一个构面维度,则具有plotmath风格的数学表达式。对于我的情况,多行带状标签的各种解决方案(例如here)有点笨拙;我在snake_case中有要素标签,并且希望能够以编程方式将它们全部转换为多行版本,而不会下降到substitute(bquote(parse(...)) hell(尽管也可以接受这些解决方案)。

我要去的方向是(尝试)编写一个自定义标签器,该标签器将应用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



设置:加载程序包,定义新旧标签
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)

r - 沿一个小平面轴解析的标签,沿另一个小平面轴解析的标签-LMLPHP

最佳答案

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

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

不起作用,但是
label_parsed(labels,multi_line=multi_line)

作品...

r - 沿一个小平面轴解析的标签,沿另一个小平面轴解析的标签-LMLPHP

关于r - 沿一个小平面轴解析的标签,沿另一个小平面轴解析的标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37399450/

10-10 09:51
查看更多