Cambiar la etiqueta de faceta a la fórmula matemática en ggplot2

Me pregunto cómo cambiar la etiqueta de facet a la fórmula matemática en ggplot2 .

 d <- ggplot(diamonds, aes(carat, price, fill = ..density..)) + xlim(0, 2) + stat_binhex(na.rm = TRUE) + opts(aspect.ratio = 1) d + facet_wrap(~ color, ncol = 4) 

enter image description here

Por ejemplo, quiero cambiar la etiqueta de faceta de D a Y[1] , donde 1 es un subíndice. Gracias de antemano por tu ayuda.

Encontré esta respuesta, pero no funciona para mí. Estoy usando R 2.15.1 y ggplot2 0.9.1 .

Quizás alguien haya cambiado el nombre de la función edit-Grob en algún momento. (Editar: Ha sido eliminado por @hadley hace aproximadamente 8 meses). No hay geditGrob pero solo editGrob de pkg: la grilla parece funcionar:

  d <- ggplot(diamonds, aes(carat, price, fill = ..density..)) + xlim(0, 2) + stat_binhex(na.rm = TRUE) + opts(aspect.ratio = 1) #Note: changes in ggplot2 functions cause this to fail from the very beginning now. # Frank Harrell's answer this year suggests `facet_warp` now accepts `labeller` d <- d + facet_wrap(~ color, ncol = 4) grob <- ggplotGrob(d) strip_elem <- grid.ls(getGrob(grob, "strip.text.x", grep=TRUE, global=TRUE))$name #strip.text.x.text.1535 #strip.text.x.text.1541 #strip.text.x.text.1547 #strip.text.x.text.1553 #strip.text.x.text.1559 #strip.text.x.text.1565 #strip.text.x.text.1571 grob <- editGrob(grob, strip_elem[1], label=expression(Y[1])) grid.draw(grob) 

Puedes editar los grobs en el cuadro,

 ggplot(diamonds, aes(carat, price, fill = ..density..)) + xlim(0, 2) + stat_binhex(na.rm = TRUE) + facet_wrap(~ color, ncol = 4) for(ii in 1:7) grid.gedit(gPath(paste0("strip_t-", ii), "strip.text"), grep=TRUE, label=bquote(gamma[.(ii)])) 

enter image description here

alternativamente, si quieres guardar un grob,

 g <- ggplotGrob(d) gg <- g$grobs strips <- grep("strip_t", names(gg)) for(ii in strips) gg[[ii]] <- editGrob(getGrob(gg[[ii]], "strip.text", grep=TRUE, global=TRUE), label=bquote(gamma[.(ii)])) g$grobs <- gg 

usar ggsave requeriría trabajo extra (feo), ya que uno tiene que engañar a la prueba para la clase ggplot ... creo que será más fácil llamar a pdf() ; grid.draw(g); dev.off() pdf() ; grid.draw(g); dev.off() pdf() ; grid.draw(g); dev.off() explícitamente.


Editar por Roland:

Hice una pequeña corrección y la envolví en una función:

 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 } 

Esto permite imprimir muy bien e incluso se puede usar ggsave .

Acabo de encontrar esta función muy útil de roland y baptiste, pero necesitaba un caso de uso ligeramente diferente donde los encabezados de envoltura originales se convirtieran por una función en lugar de proporcionarse como un valor fijo. Estoy publicando una versión ligeramente modificada de la función original en caso de que sea útil para cualquier otra persona. Permite el uso de expresiones con nombre (valor fijo) para las bandas de ajuste, así como el uso de funciones personalizadas y las funciones ya provistas por ggplot2 para el parámetro facet_grid (como label_parsed y label_bquote ).

 facet_wrap_labeller <- function(gg.plot, labels = NULL, labeller = label_value) { #works with R 3.1.2 and ggplot2 1.0.1 require(gridExtra) # old labels 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) # find new labels if (is.null(labels)) # no labels given, use labeller function new_labels <- labeller(names(gg.plot$facet$facets), old_labels) else if (is.null(names(labels))) # unnamed list of labels, take them in order new_labels <- as.list(labels) else { # named list of labels, go by name where provided, otherwise keep old new_labels <- sapply(as.list(old_labels), function(i) { if (!is.null(labels[[i]])) labels[[i]] else i }) } # replace labels 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) } 

Actualización / advertencia

Para las versiones más nuevas del paquete gridExtra obtendrá el error Error: No layers in plot al ejecutar esta función porque el arrange ya no está en gridExtra y R intenta interpretarlo como un ggplot . Puede solucionar esto al (re) introducir la función de print para la clase de arrange :

 print.arrange <- function(x){ grid::grid.draw(x) } 

Esto ahora debería permitir la ttwig y también puede usar ggsave() por ejemplo: ggsave("test.pdf", plot = facet_wrap_labeller(p, labeller = label_parsed))

Ejemplos

Un par de ejemplos de casos de uso:

 # artificial data frame 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) # no changes, wrap panel headers stay the same facet_wrap_labeller(p) # replace each panel title statically facet_wrap_labeller(p, labels = expression(alpha^1, beta^1, gamma^1, delta^1)) # only alpha and delta are replaced facet_wrap_labeller(p, labels = expression(alpha = alpha^2, delta = delta^2)) # parse original labels facet_wrap_labeller(p, labeller = label_parsed) # use original labels but modifying them via bquote facet_wrap_labeller(p, labeller = label_bquote(.(x)^3)) # custom function (eg for latex to expression conversion) library(latex2exp) facet_wrap_labeller(p, labeller = function(var, val) { lapply(paste0("$\\sum\\", val, "$"), latex2exp) }) 

A partir de ggplot2 2.1.0 ggplot2 se ha implementado para facet_wrap .