如何在facet_wrap标签中添加表达式?

10

我有一个数据集,想要绘制小型多面图,具体来说是一个 2x2 的矩阵,就像这样:

mydf <- data.frame(letter = factor(rep(c("A", "B", "C", "D"), each = 20)), x = rnorm(80), y = rnorm(80))
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, ncol = 2)

然而,我希望每个方面标签都包含一个表达式,例如

expression(paste("A or ", alpha))

我可以使用facet_grid()实现这一点

f_names <- list('A' = expression(paste("A or ", alpha)), 'B' = expression(paste("B or ", beta)), 'C' = expression(paste("C or ", gamma)), 'D' = expression(paste("D or ", delta)))
f_labeller <- function(variable, value){return(f_names[value])}
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_grid(~ letter, labeller = f_labeller)

但是我失去了2x2的数组。我如何使用表达式重命名facet_wrap() 的 facet 标签?或者,我如何通过使用facet_grid() 重新创建2x2的数组,但只对单个变量进行分面处理来解决这个问题?

(这个问题基于 @baptiste 对此前问题中的括号注释。)

谢谢!


这个有帮助吗:https://dev59.com/OGkw5IYBdhLWcg3wE2hA - Ricardo Saporta
@baptiste:是的!谢谢,你提供的链接中的facet_wrap_labeller()函数非常好用。@Ricardo:感谢你提供的链接--我已经找到了那个答案,并且它让我最初想到了这个问题。谢谢你们两个。 - RTM
1个回答

8
为了完成我所要求的任务,请先从 @Roland 的函数中加载这个标签器函数,该函数最初出现在这里
facet_wrap_labeller <- function(gg.plot,labels=NULL) {
  #works with R 3.0.1 and ggplot2 0.9.3.1
  require(gridExtra)

  g <- ggplotGrob(gg.plot)
  gg <- g$grobs      
  strips <- grep("strip_t", names(gg))

  for(ii in seq_along(labels))  {
    modgrob <- getGrob(gg[[strips[ii]]], "strip.text", 
                       grep=TRUE, global=TRUE)
    gg[[strips[ii]]]$children[[modgrob$name]] <- editGrob(modgrob,label=labels[ii])
  }

  g$grobs <- gg
  class(g) = c("arrange", "ggplot",class(g)) 
  g
}

然后保存原始的ggplot()对象:

myplot <- ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, ncol = 2)

然后调用facet_wrap_labeller(),并将表达式标签作为参数传递:
facet_wrap_labeller(myplot, labels = c(expression(paste("A or ", alpha)), expression(beta), expression(gamma), expression(delta)))

表达式现在应该显示为facet_wrap()标签。

更简单的使用方法,不需要在每个标签字段上传递表达式,也不需要在 "labels" 上:facet_wrap_labeller(myplot, expression(paste("A or ", alpha), beta, gamma, delta))。 - Eduardo
2
对于现在尝试此操作的任何人,ggplot中已经实现了解决方案。在ggplot索引底部有一个很好的示例,展示了如何使用facet_wrap轻松完成此操作。 - Nova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接