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