我正在尝试为一个场景找到一种方便的解决方案,其中一个分面维度有多行纯文本标签,而其他分面维度有绘图数学式的数学表达式。多行条带标签的各种解决方案(例如here https://stackoverflow.com/questions/13198170/combining-expression-with-n)对于我的情况来说有点笨重;我有因素标签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)
and unlist(r,recursive=FALSE)
对于这个结构都会给出错误消息......
结果(如下所示)是所有三个解析的标签都堆积在第一列中......
?label_parsed
says
返回值必须是一个矩形列表,其中每个“行”
表征单个方面。列表元素可以是
字符向量或绘图数学表达式列表。当多个
返回元素,它们显示在自己的新行上
(即,每个面都有一条多行标签)。
设置:加载包,定义新旧标签
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)