Pregunta ¿Cómo puedo eliminar los factores vacíos de las facetas ggplot2?


Estoy tratando de modificar un ejemplo de un bosque simple trazar introduciendo facetas de acuerdo con una variable de factor.

Asumiendo datos de esta estructura:

test <- structure(list(characteristic = structure(c(1L, 2L, 3L, 1L, 2L
), .Label = c("Factor1", "Factor2", "Factor3"), class = "factor"), 
    es = c(1.2, 1.4, 1.6, 1.3, 1.5), ci_low = c(1.1, 1.3, 1.5, 
    1.2, 1.4), ci_upp = c(1.3, 1.5, 1.7, 1.4, 1.6), label = structure(c(1L, 
    3L, 5L, 2L, 4L), .Label = c("1.2 (1.1, 1.3)", "1.3 (1.2, 1.4)", 
    "1.4 (1.3, 1.5)", "1.5 (1.4, 1.6)", "1.6 (1.5, 1.7)"), class = "factor"), 
    set = structure(c(1L, 1L, 1L, 2L, 2L), .Label = c("H", "S"
    ), class = "factor")), .Names = c("characteristic", "es", 
"ci_low", "ci_upp", "label", "set"), class = "data.frame", row.names = c(NA, 
-5L))

Y ejecutando el código:

p <- ggplot(test, aes(x=characteristic, y=es, ymin=ci_low, ymax=ci_upp)) + geom_pointrange() +
  coord_flip() + geom_hline(aes(x=0), lty=2) + 
  facet_wrap(~ set, ncol = 1) +
  theme_bw() + 
  opts(strip.text.x = theme_text())

Produce resultados como ese:

enter image description here

Todo bien hasta ahora. Sin embargo, me gustaría deshacerme del nivel vacío de Factor3 desde mi panel inferior y no puedo encontrar la forma de hacerlo. ¿Hay alguna forma de hacer eso?

Gracias por la ayuda.


15
2018-04-16 23:57


origen


Respuestas:


EDITAR Actualizado a ggplot2 0.9.3

Aquí hay otra solución. Usa facet_grid y space = "free"; también usa geom_point() y geom_errorbarh(), y por lo tanto no hay necesidad de coord.flip(). Además, las etiquetas de marcas de eje X aparecen solo en el panel inferior. En el código a continuación, el theme el comando no es esencial: se usa para rotar el texto de la tira para que aparezca horizontalmente. Utilizando el test dataframe desde arriba, el siguiente código debería producir lo que desea:

library(ggplot2)

p <- ggplot(test, aes(y = characteristic, x = es, xmin = ci_low, xmax = ci_upp)) +
   geom_point() +
   geom_errorbarh(height = 0) +
   facet_grid(set ~ ., scales = "free", space = "free") +
   theme_bw() +
   theme(strip.text.y = element_text(angle = 0))

p

La solución se basa en el ejemplo de la página 124 del libro ggplot2 de Wickham.


17
2018-04-18 23:38



Utilizar scales = "free" como en:

p <- ggplot(test, aes(x=characteristic, y=es, ymin=ci_low, ymax=ci_upp)) + geom_pointrange() +
  coord_flip() + geom_hline(aes(x=0), lty=2) + 
  facet_wrap(~ set, ncol = 1, scales="free") +
  theme_bw() + 
  opts(strip.text.x = theme_text())

p

Que produce:

enter image description here

EDIT: realmente creo que me gusta drop = TRUE argumento mejor para esta solución como en:

p <- ggplot(test, aes(x=characteristic, y=es, ymin=ci_low, ymax=ci_upp)) + 
  geom_pointrange() +
  coord_flip() + geom_hline(aes(x=0), lty=2) + 
  facet_wrap(~ set, ncol = 1,  drop=TRUE) +
  theme_bw() + 
  opts(strip.text.x = theme_text())

p

13
2018-04-17 00:07