我刚刚发现了Roland和Baptiste的一个非常有用的函数,但需要一个略微不同的用例,原始的包装标题应该由一个函数转换而不是作为固定值提供。如果对其他人有用,我会发布稍微修改过的原始函数版本。它允许使用命名(固定值)表达式来包装条带,以及使用自定义函数和ggplot2已提供的函数来处理facet_grid
labeller
参数(例如label_parsed
和label_bquote
)。
facet_wrap_labeller <- function(gg.plot, labels = NULL, labeller = label_value) {
require(gridExtra)
g <- ggplotGrob(gg.plot)
gg <- g$grobs
strips <- grep("strip_t", names(gg))
modgrobs <- lapply(strips, function(i) {
getGrob(gg[[i]], "strip.text", grep=TRUE, global=TRUE)
})
old_labels <- sapply(modgrobs, function(i) i$label)
if (is.null(labels))
new_labels <- labeller(names(gg.plot$facet$facets), old_labels)
else if (is.null(names(labels)))
new_labels <- as.list(labels)
else {
new_labels <- sapply(as.list(old_labels), function(i) {
if (!is.null(labels[[i]])) labels[[i]] else i
})
}
for(i in 1:length(strips)) {
gg[[strips[i]]]$children[[modgrobs[[i]]$name]] <-
editGrob(modgrobs[[i]], label=new_labels[[i]])
}
g$grobs <- gg
class(g) = c("arrange", "ggplot",class(g))
return(g)
}
更新/警告
对于gridExtra
包的较新版本,如果运行此函数,则会收到错误信息Error: No layers in plot
,因为arrange
不再在gridExtra
中,并且R试图将其解释为ggplot
。你可以通过重新引入arrange
类的print
函数来解决此问题:
print.arrange <- function(x){
grid::grid.draw(x)
}
现在这样做可以使图表渲染,您可以像这样使用 ggsave()
: ggsave("test.pdf", plot = facet_wrap_labeller(p, labeller = label_parsed))
示例
一些用例示例:
data <- data.frame(x=runif(16), y=runif(16), panel = rep(c("alpha", "beta", "gamma","delta"), 4))
p <- ggplot(data, aes(x,y)) + geom_point() + facet_wrap(~panel)
facet_wrap_labeller(p)
facet_wrap_labeller(p, labels = expression(alpha^1, beta^1, gamma^1, delta^1))
facet_wrap_labeller(p, labels = expression(alpha = alpha^2, delta = delta^2))
facet_wrap_labeller(p, labeller = label_parsed)
facet_wrap_labeller(p, labeller = label_bquote(.(x)^3))
library(latex2exp)
facet_wrap_labeller(p, labeller = function(var, val) {
lapply(paste0("$\\sum\\", val, "$"), latex2exp)
})
facet_wrap
没有labeller
参数。只有facet_grid
有,我不知道为什么。 - Luciano Selzer