2012-07-05 23 views
66

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 etiquetadora repiten mucho texto innecesario y no se pueden usar para títulos variables más largos.¿Cómo se agrega una etiqueta general a las facetas en ggplot2?

¿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

Como se indica por @Hendy, similar a: add a secondary y axis to ggplot2 plots - make it perfect

+1

Holy cow. Estaba * solo * buscando esto, encontré esto a través de google ... y ahora veo que se lo preguntaron hace un minuto. [Esta pregunta] (http: // stackoverflow.com/questions/9096671/add-a-secondary-y-axis-to-ggplot2-plot-make-it-perfect) parece estar preguntando lo mismo basado en 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 las variables de facetado. – Hendy

+0

Hice una [pregunta similar en el pasado.] (Http://stackoverflow.com/q/7603949/707145) – MYaseen208

+3

Inquirí con Winston Chang (no conozco su manejador SO), uno de los principales desarrolladores de ggplot, vía correo electrónico. Él no cree que esto sea actualmente una opción, pero podría considerar agregarlo. Sugirió que agregue un problema en github, [así lo hice] (https://github.com/hadley/ggplot2/issues/612) – Hendy

Respuesta

43

Como la última ggplot2 utiliza gtable internamente, es bastante fácil de 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 etiquetas de la tira. Una versión futura de ggplot2 puede tener esta funcionalidad; pero no estoy seguro

+0

- 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 última documentación http://docs.ggplot2.org/0.9.3.1/ – yosukesabai

+1

La versión 0.9.3.1 proporciona 'ggplotGrob()' que es lo mismo que 'ggplot_gtable (ggplot_build ()) '. Creo que esta es la mejor manera. – kohske

+0

Este enfoque sobrescribe la leyenda cuando hay una. Me pregunto si hay una forma de prevenir esto. – papirrin

1

Además del método descrito por kohske, se puede añadir un borde a las cajas añadido cambiando

col=NA 

a

col=gray(0.5), linetype=1 

Además, cambiar

fill=gray(0.5) 

de

fill=grey(0.8) 

y

gp=gpar(col=gray(1)) 

a

gp=gpar(col=gray(0)) 

Si desea que las nuevas barras para que coincida con las etiquetas de la faceta

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

Puede haber una forma mejor de hacer pero puedes:

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 
Cuestiones relacionadas