2012-07-05 9 views
66

Spesso ho valori numerici per la sfaccettatura. Desidero fornire informazioni sufficienti per interpretare questi valori di sfaccettatura in un titolo supplementare, simile ai titoli degli assi. Le opzioni dell'etichettatrice ripetono molto testo non necessario e non sono utilizzabili per titoli variabili più lunghi.Come si aggiunge un'etichetta generale ai facet in ggplot2?

Qualche suggerimento?

Il valore di default:

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

Quello che mi piacerebbe:

enter image description here

Il meglio che posso fare in ggplot:

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

enter image description here

Come indicato da @Hendy, simile a: add a secondary y axis to ggplot2 plots - make it perfect

+1

Mucca sacra. Ero * solo * cercando questo, trovato questo tramite google ... e ora vedo che è stato chiesto un minuto fa. [Questa domanda] (http: // StackOverflow.it/questions/9096671/add-a-secondary-y-axis-to-ggplot2-plots-make-it-perfect) sembra chiedere la stessa cosa in base al suo commento, nonostante il titolo che potrebbe implicare altrimenti. Grandi prototipi da illustrare. Questo è esattamente il mio problema: sarebbe bello se non dovessi spiegare le mie categorie di sfaccettature numeriche. Il grafico dovrebbe parlare da solo con una semplice etichetta che spiega quali erano le variabili di sfaccettatura. – Hendy

+0

Ho fatto una [domanda simile in passato.] (Http://stackoverflow.com/q/7603949/707145) – MYaseen208

+3

Ho chiesto a Winston Chang (non so il suo SO handle), uno dei principali sviluppatori di ggplot, Via Posta Elettronica. Non ritiene che questa sia attualmente un'opzione, ma potrebbe prendere in considerazione l'aggiunta. Mi ha suggerito di aggiungere un problema su github, [così ho fatto] (https://github.com/hadley/ggplot2/issues/612) – Hendy

risposta

43

Come ultima ggplot2 utilizza gtable internamente, è abbastanza facile modificare 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

Naturalmente, è possibile scrivere una funzione che aggiunge automaticamente le etichette della striscia. Una versione futura di ggplot2 potrebbe avere questa funzionalità; non sono sicuro però.

+0

- Mi chiedo se questo è ancora l'approccio più pulito, a partire dalla versione 0.9.3.1. Non vedo qualcosa che assomigli a "questa fuctionality" nell'ultima documentazione http://docs.ggplot2.org/0.9.3.1/ – yosukesabai

+1

La versione 0.9.3.1 fornisce 'ggplotGrob()' che è lo stesso di 'ggplot_gtable (ggplot_build ()) '. Penso che questo sia ancora il modo migliore. – kohske

+0

Questo approccio sovrascrive la legenda quando ce n'è una. Mi chiedo se c'è un modo per impedirlo. – papirrin

1

Oltre al metodo delineato da kohske, è possibile aggiungere un bordo alle scatole aggiunti modificando

col=NA 

a

col=gray(0.5), linetype=1 

Inoltre, cambiare

fill=gray(0.5) 

per

fill=grey(0.8) 

e

gp=gpar(col=gray(1)) 

a

gp=gpar(col=gray(0)) 

Se si desidera che le nuove barre per abbinare l'aspetto etichette

cioè

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

Ci può essere un modo migliore per farlo ma puoi:

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 
Problemi correlati