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

82

A menudo tengo valores numéricos para facetar. Deseo proporcionar información suficiente para interpretar estos valores de facetas en un título complementario, similar a los títulos de los ejes. Las opciones de etiquetadora repiten mucho texto innecesario y no se pueden utilizar 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)

ingrese la descripción de la imagen aquí

Lo que me encantaría:

ingrese la descripción de la imagen aquí

Lo mejor que puedo hacer en ggplot:

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

ingrese la descripción de la imagen aquí

Como lo indica @Hendy, similar a: agregue un eje y secundario a los gráficos de ggplot2: hágalo perfecto

Etienne Low-Décarie
fuente
1
Santa vaca. Yo estaba simplemente buscando esto, ha encontrado a través de Google ... y ahora ver que se le pidió hace un minuto. Esta pregunta parece estar haciendo lo mismo en base a su comentario, a pesar del título que podría implicar lo contrario. Grandes maquetas para ilustrar. Este es exactamente mi problema: sería bueno si no tuviera que explicar mis categorías de facetas numéricas. El gráfico debe hablar por sí mismo con una etiqueta simple que explique cuáles fueron las variables de facetas.
Hendy
3
Pregunté a Winston Chang (no conozco su nombre de usuario SO), uno de los principales desarrolladores de ggplot, por correo electrónico. Él no cree que esta sea una opción actualmente, pero podría considerar agregarla. Me sugirió que agregara un problema en github, así que lo hice
Hendy
1
Parece que esto apareció en la lista de correo y Winston me lo hizo saber. Creó una rama con una implementación general de esto para las etiquetas principales. Vea el hilo aquí . @hadley: tienes razón. No tengo idea de lo difícil que es hacerlo en general. Si esto nunca sucede ... mi gratitud por ggplot aún prevalece :)
Hendy
1
En algún momento dejo de intentar disputar R / ggplot2 y hago algunas modificaciones deseadas usando un editor de imágenes.
Andy
2
alguna actualización sobre las mejores prácticas aquí?
Arthur Yip

Respuestas:

49

Como los últimos ggplot2usos gtableinternos, 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)

ingrese la descripción de la imagen aquí

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

Kohske
fuente
- Me pregunto si este sigue siendo el enfoque más limpio, a partir de la versión 0.9.3.1. No veo algo que se parezca a "esta funcionalidad" en la documentación más reciente docs.ggplot2.org/0.9.3.1
yosukesabai
1
La versión 0.9.3.1 proporciona ggplotGrob()lo mismo que ggplot_gtable(ggplot_build()). Creo que esta sigue siendo la mejor forma.
kohske
1
Si no me equivoco, esta solución ya no es válida ya que algunas funciones ahora están en desuso.
Remi.b
1
@ Remi.b pruébalo ahora
rawr
3
Esto no funciona con ggplot2 3.2.1 y R 3.6.1. No hay mensaje de error pero no obtengo las etiquetas en el gráfico resultante.
Calimo
5

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
Diogo
fuente
1

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

col=NA

a

col=gray(0.5), linetype=1

Además, cambia

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 nuevas barras coincidan con las etiquetas 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)))
Shannon Hodges
fuente