我试图找到一个方便的解决方案,以解决一个场景维度的多行纯文本标签和另一个分面维度的 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
说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)
作品...
关于r - 沿一个面轴解析标签,沿另一个面轴未解析标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37399450/