¿Cómo se agrega una etiqueta general a las facetas en ggplot2?

A menudo tengo valores numéricos para facetar. Deseo proporcionar información suficiente para interpretar estos valores de facetado en un título suplementario, similar a los títulos de los ejes. Las opciones de etiquetado repiten mucho texto innecesario y no se pueden usar para títulos variables más largos.

¿Alguna sugerencia?

El valor por defecto:

test<-data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20)) qplot(data=test, x=x, y=y, facets=facet.b~facet.a) 

enter image description here

Lo que me gustaría:

enter image description here

Lo mejor que puedo hacer en ggplot:

 qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both) 

enter image description here

Según lo indicado por @Hendy, similar a: agregar un eje y secundario a las ggplot2 gráficas – hacerlo perfecto

Como el último ggplot2 usa internamente gtable , es bastante fácil modificar una figura:

 library(ggplot2) test < - data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20)) p <- qplot(data=test, x=x, y=y, facets=facet.b~facet.a) # get gtable object z <- ggplotGrob(p) library(grid) library(gtable) # add label for right strip z <- gtable_add_cols(z, unit(z$widths[[7]], 'cm'), 7) z <- gtable_add_grob(z, list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))), textGrob("Variable 1", rot = -90, gp = gpar(col = gray(1)))), 4, 8, 6, name = paste(runif(2))) # add label for top strip z <- gtable_add_rows(z, unit(z$heights[[3]], 'cm'), 2) z <- gtable_add_grob(z, list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))), textGrob("Variable 2", gp = gpar(col = gray(1)))), 3, 4, 3, 6, name = paste(runif(2))) # add margins z <- gtable_add_cols(z, unit(1/8, "line"), 7) z <- gtable_add_rows(z, unit(1/8, "line"), 3) # draw it grid.newpage() grid.draw(z) 

enter image description here

Por supuesto, puede escribir una función que agregue automáticamente las tags de la tira. Una versión futura de ggplot2 puede tener esta funcionalidad; pero no estoy seguro

Además del método descrito por kohske, puede agregar un borde a los cuadros agregados al cambiar

 col=NA 

a

 col=gray(0.5), linetype=1 

Además, cambie

 fill=gray(0.5) 

para

 fill=grey(0.8) 

y

 gp=gpar(col=gray(1)) 

a

 gp=gpar(col=gray(0)) 

Si desea que las barras nuevas coincidan con las tags de facetas

es decir

 z < - gtable_add_grob(z, list(rectGrob(gp = gpar(col = gray(0.5), linetype=1, fill = gray(0.8))), textGrob("Variable 1", rot = -90, gp = gpar(col = gray(0)))), 4, 8, 6, name = paste(runif(2))) 

Puede haber una mejor manera de hacerlo, pero puede:

 fac1 = factor(rep(c('a','b'),10)) fac2 = factor(rep(c('a','b'),10)) data = data.frame(x=1:10, y=1:10, fac1=fac1, fac2=fac2) p = ggplot(data,aes(x,y)) + ggplot2::geom_point() + facet_grid(fac1~fac2) p + theme(plot.margin = unit(c(1.5,1.5,0.2,0.2), "cm")) grid::grid.text(unit(0.98,"npc"),0.5,label = 'label ar right', rot = 270) # right grid::grid.text(unit(0.5,"npc"),unit(.98,'npc'),label = 'label at top', rot = 0) # top