Combinando grid_arrange_shared_legend () e facet_wrap_labeller () em R

Estou tentando combinargrid_arrange_shared_legend() efacet_wrap_labeller() em R. Mais especificamente, quero desenhar uma figura incluindo duas figuras ggplot com vários painéis cada uma e ter uma legenda comum. Quero ainda colocar em itálico parte dos rótulos das facetas. O primeiro é possível com ogrid_arrange_shared_legend() função introduzidaaqui, e o último pode ser alcançado com ofacet_wrap_labeller() funçãoaqui. No entanto, não consegui combinar os dois.

Aqui está um exemplo.

library("ggplot2")
set.seed(1)
d <- data.frame(
  f1 = rep(LETTERS[1:3], each = 100),
  f2 = rep(letters[1:3], 100),
  v1 = runif(3 * 100),
  v2 = rnorm(3 * 100)
)
p1 <- ggplot(d, aes(v1, v2, color = f2)) + geom_point() + facet_wrap(~f1)
p2 <- ggplot(d, aes(v1, v2, color = f2)) + geom_smooth() + facet_wrap(~f1)

Posso colocar p1 e p2 na mesma figura e ter uma legenda comum usandogrid_arrange_shared_legend() (ligeiramente modificado do original).

grid_arrange_shared_legend <- function(...) {
    plots <- list(...)
    g <- ggplotGrob(plots[[1]] + theme(legend.position = "right"))$grobs
    legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
    lheight <- sum(legend$width)
    grid.arrange(
        do.call(arrangeGrob, lapply(plots, function(x)
            x + theme(legend.position = "none"))),
        legend,
        ncol = 2,
        widths = unit.c(unit(1, "npc") - lheight, lheight))
}
grid_arrange_shared_legend(p1, p2)

Aqui está o que eu recebo.

É possível colocar itálico em parte da etiqueta da tirafacet_wrap_labeller().

facet_wrap_labeller <- function(gg.plot,labels=NULL) {
  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
}
facet_wrap_labeller(p1, 
  labels = c(
    expression(paste("A ", italic(italic))),
    expression(paste("B ", italic(italic))), 
    expression(paste("C ", italic(italic)))
  )
)

No entanto, não posso combinar os dois de maneira direta.

p3 <- facet_wrap_labeller(p1, 
  labels = c(
    expression(paste("A ", italic(italic))),
    expression(paste("B ", italic(italic))), 
    expression(paste("C ", italic(italic)))
  )
)
p4 <- facet_wrap_labeller(p2, 
  labels = c(
    expression(paste("A ", italic(italic))),
    expression(paste("B ", italic(italic))), 
    expression(paste("C ", italic(italic)))
  )
)
grid_arrange_shared_legend(p3, p4)
# Error in plot_clone(p) : attempt to apply non-function

Alguém sabe como modificar uma ou ambas as funções para que elas possam ser combinadas? Ou existe alguma outra maneira de alcançar a meta?

questionAnswers(1)

yourAnswerToTheQuestion