2016-05-10 54 views
10

Sto usando facet_wrap di dividere il mio grafico a dispersione comeggplot2: Mettere le etichette facet_wrap multi-variabile su una linea

facet_wrap(x~y+z) 

Questo genera 22 appezzamenti nel mio caso, se lo desideri. Tuttavia, l'etichetta per ciascuno di questi 22 grafici viene visualizzata in 3 righe (x, yez) che consumano inutilmente lo spazio nella finestra e squittiscono i grafici in una piccola area. Preferirei che le mie trame fossero più grandi. Poiché le variabili y e z sono brevi, vorrei visualizzarle nella stessa riga anziché in due.

Ho esaminato le opzioni dell'etichettatrice ma nessuno di loro sembra fare ciò che vorrei. Gradirei qualche suggerimento qui.

risposta

9

In questo caso si potrebbe anche prendere in considerazione label_wrap_gen():

p <- ggplot(mtcars, aes(wt,mpg)) + geom_point() 
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE)) 

Per maggiori dettagli si veda anche here e here .

6

Non sono sicuro di come farlo con una funzione etichettatrice, ma un'altra opzione è creare una variabile di raggruppamento che combini tutte e tre le variabili categoriali in una singola variabile che può essere utilizzata per la sfaccettatura. Ecco un esempio che utilizza il frame di dati integrato mtcars e il pacchetto dplyr per creare al volo la nuova variabile di raggruppamento. Di seguito si tratta di un aggiornamento con una funzione che consente la scelta dinamica da una a tre variabili di sfaccettatura.

library(dplyr) 

ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")), 
     aes(wt,mpg)) + 
    geom_point() + 
    facet_wrap(~group) 

enter image description here

UPDATE: quanto riguarda il commento di flessibilità, il codice qui sotto è una funzione che permette all'utente di inserire il frame di dati desiderato e nomi di variabili, tra cui la scelta in modo dinamico per sfaccettatura su uno, due o tre colonne.

library(dplyr) 
library(lazyeval) 

mygg = function(dat, v1, v2, f1, f2=NA, f3=NA) { 

    dat = dat %>% 
    mutate_(group = 
       if (is.na(f2)) { 
       f1 
       } else if (is.na(f3)) { 
       interp(~paste(f1,f2, sep='-'), f1=as.name(f1), f2=as.name(f2)) 
       } else { 
       interp(~paste(f1,f2,f3,sep='-'), f1=as.name(f1), f2=as.name(f2), f3=as.name(f3)) 
       }) 

    ggplot(dat, aes_string(v1,v2)) + 
    geom_point() + 
    facet_wrap(~group) 
} 

Ora proviamo la funzione:

library(vcd) # For Arthitis data frame 

mygg(Arthritis, "ID","Age","Sex","Treatment","Improved") 
mygg(mtcars, "wt","mpg","cyl","am") 
mygg(iris, "Petal.Width","Petal.Length","Species") 

enter image description here

+0

Grazie, questo funziona sicuramente. Tuttavia, mi piacerebbe scoprire se c'è un modo per farlo usando i parametri ggplot2. Potrei voler sfaccettare i miei diagrammi usando variabili diverse e vorrei anche evitare la ridondanza nella mia tabella di dati che è già enorme. – beeprogrammer

+1

Vedere la risposta aggiornata. Si noti inoltre che il codice non aggiunge alcuna colonna all'oggetto del frame di dati. La colonna extra viene aggiunta solo all'interno della funzione ggplot e non altera l'oggetto frame dati stesso. – eipi10