plots plot_grid multiple ggplot arrange r ggplot2 grob

plot_grid - plot grid r



¿Inverso de ggplotGrob? (1)

Yo diría que no. ggplotGrob es una calle de sentido único. Los objetos grob dibujan primitivas definidas por grilla. Puedes crear grobs arbitrarios desde cero. No hay una forma general de convertir una colección aleatoria de grobs en una función que los genere (no es invertible porque no es 1: 1). Una vez que te vuelves grob, nunca vuelves.

Podría envolver un objeto ggplot en una clase personalizada y sobrecargar los comandos de trazado / impresión para hacer algunas manipulaciones grob personalizadas, pero eso probablemente sea aún más hack-ish.

Tengo una función que manipula un objeto ggplot, convirtiéndolo en grob y luego modificando las capas. Me gustaría que la función devuelva un objeto ggplot, no un grob. ¿Hay alguna forma sencilla de convertir un grob en gg?

La documentación en ggplotGrob es terriblemente escasa.
Ejemplo simple:

P <- ggplot(iris) + geom_bar(aes(x=Species, y=Petal.Width), stat="identity") G <- ggplotGrob(P) ... some manipulation to G ... ## DESIRED: P2 <- inverse_of_ggplotGrob(G) such that, we can continue to use basic ggplot syntax, ie `P2 + ylab ("The Width of the Petal")`

ACTUALIZAR:

Para responder a la pregunta en el comentario, la motivación aquí es modificar los colores de las etiquetas de facetas mediante programación, en función del valor del nombre de la etiqueta en cada faceta. Las siguientes funciones funcionan muy bien (en base a la aportación del bautismo en una pregunta anterior).

Me gustaría que el valor de retorno de colorByGroup sea ​​un objeto ggplot, no simplemente un grob.

Aquí está el código, para aquellos interesados

get_grob_strips <- function(G, strips=grep(pattern="strip.*", G$layout$name)) { if (inherits(G, "gg")) G <- ggplotGrob(G) if (!inherits(G, "gtable")) stop ("G must be a gtable object or a gg object") strip.type <- G$layout[strips, "name"] ## I know this works for a simple strip.nms <- sapply(strips, function(i) { attributes(G$grobs[[i]]$width$arg1)$data[[1]][["label"]] }) data.table(grob_index=strips, type=strip.type, group=strip.nms) } refill <- function(strip, colour){ strip[["children"]][[1]][["gp"]][["fill"]] <- colour return(strip) } colorByGroup <- function(P, colors, showWarnings=TRUE) { ## The names of colors should match to the groups in facet G <- ggplotGrob(P) DT.strips <- get_grob_strips(G) groups <- names(colors) if (is.null(groups) || !is.character(groups)) { groups <- unique(DT.strips$group) if (length(colors) < length(groups)) stop ("not enough colors specified") colors <- colors[seq(groups)] names(colors) <- groups } ## ''groups'' should match the ''group'' in DT.strips, which came from the facet_name matched_groups <- intersect(groups, DT.strips$group) if (!length(matched_groups)) stop ("no groups match") if (showWarnings) { if (length(wh <- setdiff(groups, DT.strips$group))) warning ("values in ''groups'' but not a facet label: /n", paste(wh, colapse=", ")) if (length(wh <- setdiff(DT.strips$group, groups))) warning ("values in facet label but not in ''groups'': /n", paste(wh, colapse=", ")) } ## identify the indecies to the grob and the appropriate color DT.strips[, color := colors[group]] inds <- DT.strips[!is.na(color), grob_index] cols <- DT.strips[!is.na(color), color] ## Fill in the appropriate colors, using refill() G$grobs[inds] <- mapply(refill, strip = G$grobs[inds], colour = cols, SIMPLIFY = FALSE) G }