2013-02-27 10 views
21

sto tramando cose usando facet_wrap e facet_grid in ggplot, come:l'ordine di controllo di facet_grid/facet_wrap in ggplot2?

ggplot(iris) + geom_histogram(aes(iris$Petal.Width)) + facet_grid(Species ~ .) 

E 'possibile controllare l'ordine in cui i Species pannelli sono ordinate nella trama? Questo può essere fatto senza modificare il dataframe iris o crearne uno nuovo? Il default qui mostra setosa, versicolor, virginica ma mi piacerebbe un ordine diverso. Grazie.

+1

forse 'facet_grid (factor (Species, levels = c (" virginica "," setosa "," versicolor ")) ~.)'? [oops, non funziona] –

+1

Come osserva Ben, il modo di controllare l'ordinamento di praticamente tutto in ggplot (barre in grafici a barre, sfaccettature, ecc.) consiste nell'utilizzare un fattore e regolare l'ordine dei livelli. – joran

+0

... o questo: http://stackoverflow.com/q/3311901/324364 – joran

risposta

24

Non credo che posso davvero soddisfare la vostra "senza fare una nuova cornice di dati" requisito, ma è possibile creare il nuovo telaio dati al volo:

ggplot(transform(iris, 
     Species=factor(Species,levels=c("virginica","setosa","versicolor")))) + 
    geom_histogram(aes(Petal.Width))+ facet_grid(Species~.) 

Sono d'accordo che sarebbe stato bello se ci fosse un altro modo per controllare questo, ma è già un ggplot piuttosto potente (e complicato) motore ...

Nota che l'ordine di (1) le righe nei set di dati è indipendente dall'ordine di (2) i livelli del fattore. # 2 è ciò che cambia factor(...,levels=...) e che cosa ggplot esamina per determinare l'ordine delle faccette. Fare # 1 (ordinare le righe del frame di dati in un ordine specificato) è una sfida interessante. Penso che mi sarebbe effettivamente raggiungere questo obiettivo facendo # 2 prima, e quindi utilizzando order() o arrange() per ordinare in base ai valori numerici del fattore:

neworder <- c("virginica","setosa","versicolor") 
library(plyr) ## or dplyr (transform -> mutate) 
iris2 <- arrange(transform(iris, 
      Species=factor(Species,levels=neworder)),Species) 

Non riesco a vedere immediatamente un modo rapido per fare questo senza cambiando l'ordine dei livelli di fattore (è possibile farlo e quindi ripristinare di conseguenza l'ordine dei livelli di fattore).

In generale, le funzioni in R che dipendono dall'ordine dei livelli di una variabile categoriale sono basate sull'ordine a livello di fattore, non sull'ordine delle righe nel set di dati: la risposta sopra si applica in generale.

+0

Puoi spiegare cosa sta facendo esattamente la chiamata 'transform' qui? Se digito 'transform (iris, factor (Species, levels = c (" virginica "," setosa "," versicolor ")))' in R, non emette un dataframe con 'Species' nell'ordine dato da 'levels' – user248237dfsf

+0

Penso che tu abbia omesso la parte' Species = 'della chiamata' transform' ... 'transform' * sta * generando un nuovo frame di dati. –

+0

Ho sbagliato a scrivere, mi dispiace. Se faccio 'transform (iris, Species = factor (Species, levels = c (" virginica "," setosa "," versicolor ")))) in R, emette un dataframe che ha l'ordine:' setosa, versicolor, virginica' quindi non capisco come funziona la trasformazione qui. La vostra chiamata completa produce il grafico che volevo, ma sono confuso sul motivo per cui questa chiamata 'transform' non dà l'ordine specificato in' levels'. grazie – user248237dfsf