web-dev-qa-db-fra.com

Comment ajouter une étiquette générale aux facettes dans ggplot2?

J'ai souvent des valeurs numériques pour le facettage. Je souhaite fournir suffisamment d'informations pour interpréter ces valeurs de facettes dans un titre supplémentaire, similaire aux titres des axes. Les options d'étiqueteuse répètent beaucoup de texte inutile et sont inutilisables pour les titres de variable plus longs.

Aucune suggestion?

Le défaut:

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

Ce que j'aimerais:

enter image description here

Le mieux que je puisse faire dans ggplot:

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

enter image description here

Comme indiqué par @Hendy, similaire à: ajoutez un axe y secondaire aux tracés ggplot2 - rendez-le parfait

76

Comme le dernier ggplot2 utilise gtable en interne, il est assez facile de modifier une figure:

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

Bien sûr, vous pouvez écrire une fonction qui ajoute automatiquement les étiquettes de bande. Une future version de ggplot2 peut avoir cette fonctionnalité; pas sûr cependant.

46
kohske

Il peut y avoir une meilleure façon de le faire, mais vous pouvez:

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

En plus de la méthode décrite par kohske, vous pouvez ajouter une bordure aux cases ajoutées en changeant

col=NA

à

col=gray(0.5), linetype=1

Aussi, changez

fill=gray(0.5)

for

fill=grey(0.8)

et

gp=gpar(col=gray(1))

à

gp=gpar(col=gray(0))

Si vous souhaitez que les nouvelles barres correspondent aux étiquettes de facette

c'est à dire

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)))
1
Shannon Hodges