2012-04-16 20 views
14

Estoy tratando de modificar un diagrama example of a simple forest introduciendo facetas de acuerdo con una variable de factor.¿Cómo puedo eliminar los factores vacíos de las facetas de ggplot2?

datos Suponiendo que 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 ejecutar 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 una salida de esa manera:

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.

+5

Al hacer referencia a R, dejé de preguntar "¿Hay ..." y comencé a preguntar "¿Cómo puedo ..." 'install.packages (" fortunes "); biblioteca (fortunas); fortuna ("Yoda") ' –

Respuesta

14

EDIT Actualizado a ggplot2 0.9.3

Aquí hay otra solución. Utiliza 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 siguiente, el comando theme no es esencial: se usa para rotar el texto de la tira para que aparezca horizontalmente. El uso de la trama de datos test desde arriba, el siguiente código debe producir lo que quiere:

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 en el libro ggplot2 de Wickham.

+1

ggplot2 nunca deja de sorprenderme. – radek

12

Uso 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: De hecho, creo que me gusta el argumento drop = TRUE 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 
+0

¡Excelente! Funcionó como un encanto. Una pregunta sin embargo: ¿los paneles siempre serán de un tamaño proporcionado (verticalmente)? ¿Hay ... No? ¿Cómo puedo escalarlos según la cantidad de factores utilizados por cada uno? Por ejemplo, si tengo 10 en el panel superior y 3 en el inferior. – radek

+3

Creo que 'space =" free "' es el otro argumento que estás buscando. –

+0

Creo que el argumento 'space =" free "' es para [facet_grid] (http://had.co.nz/ggplot2/facet_grid.html). Sin embargo, 'scales = 'free_x'' ya no funciona:/ – radek

Cuestiones relacionadas