Comment ajouter un label général aux facettes dans ggplot2?

j'ai souvent des valeurs numériques pour le faceting. Je souhaite fournir suffisamment d'informations pour interpréter ces valeurs factuelles dans un titre supplémentaire, similaire aux titres de l'axe. Les options labeller répètent beaucoup de texte inutile et sont inutilisables pour des titres variables plus longs.

des suggestions?

par 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 à: ajouter un axe secondaire y aux tracés ggplot2-le rendre parfait "1519260920

69
demandé sur Community 2012-07-06 02:15:36

3 réponses

comme le dernier ggplot2 utilise gtable à l'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 pourrait avoir cette fonctionnalité; pas sûr cependant.

44
répondu kohske 2016-05-03 15:17:39

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

changer

fill=gray(0.5)

pour

fill=grey(0.8)

et

gp=gpar(col=gray(1))

à

gp=gpar(col=gray(0))

si vous voulez que les nouvelles barres correspondent aux étiquettes facette

ie

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
répondu Shannon Hodges 2014-08-21 02:24:06

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
0
répondu Diogo 2017-12-29 15:36:26