Come posso rimuovere i fattori vuoti dalle sfaccettature di ggplot2?

Sto cercando di modificare un esempio di un semplice grafico forestale introducendo sfaccettature in base a una variabile fattore.

Supponendo i dati di questa struttura:

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)) 

E facendo funzionare il codice:

 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 risultati del genere:

inserisci la descrizione dell'immagine qui

Tutto bene finora. Tuttavia, mi piacerebbe sbarazzarmi del livello Factor3 vuoto dal mio pannello inferiore e non riesco a trovare un modo per farlo. C’è un modo per farlo?

Grazie per l’aiuto.

EDIT Aggiornato a ggplot2 0.9.3

Ecco un’altra soluzione. Usa facet_grid e space = "free" ; inoltre usa geom_point() e geom_errorbarh() , e quindi non c’è bisogno di coord.flip() . Inoltre, le etichette dei segni di graduazione sull’asse x vengono visualizzate solo nel pannello inferiore. Nel codice sottostante, il comando del theme non è essenziale: viene utilizzato per ruotare il testo della striscia in modo che appaia orizzontalmente. Utilizzando il dataframe del test dall’alto, il codice seguente dovrebbe produrre ciò che desideri:

 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 soluzione è basata sull'esempio a pagina 124 nel libro ggplot2 di Wickham.

Usa scales = "free" come in:

 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 

Che produce:

inserisci la descrizione dell'immagine qui

EDIT: In realtà penso che mi piace l'argomento drop = TRUE meglio per questa soluzione come in:

 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