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)
Ce que j'aimerais:
Le mieux que je puisse faire dans ggplot:
qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both)
Comme indiqué par @Hendy, similaire à: ajoutez un axe y secondaire aux tracés ggplot2 - rendez-le parfait
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)
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.
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
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)))