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

Estoy tratando de modificar un ejemplo de un diagtwig de bosque simple mediante la introducción de 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.

EDITAR 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 tags de marcas de eje X aparecen solo en el panel inferior. En el siguiente código, el comando de theme no es esencial: se usa para rotar el texto de la tira para que aparezca horizontalmente. Usando el dataframe de test de 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.

Use 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 más el argumento drop = TRUE para esta solución que 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