2013-02-27 11 views
21

Ich Plotten Dinge facet_wrap und facet_grid in ggplot verwenden, wie:Steuerung der Reihenfolge von facet_grid/facet_wrap in ggplot2?

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

Ist es möglich, die Reihenfolge, in der die Species Platten in der Handlung geordnet zu kontrollieren? Kann dies geschehen, ohne den Datenrahmen iris zu ändern oder einen neuen zu erstellen? Der Standard hier zeigt Setosa, versicolor, virginica, aber ich möchte eine andere Reihenfolge. Vielen Dank.

+1

vielleicht 'facet_grid (Faktor (Art, levels = c (" virginica "," setosa "," versicolor ")). [oops, funktioniert nicht] –

+1

Wie Ben bemerkt, ist die Art und Weise, die Reihenfolge von im Grunde alles in ggplot zu steuern (Balken in Balkenplots, Facetten usw.), einen Faktor zu verwenden und die Reihenfolge der Ebenen anzupassen. – joran

+0

... oder das: http://Stackoverflow.com/q/3311901/324364 – joran

Antwort

24

Ich glaube nicht, dass ich wirklich Ihr „ohne einen neuen Datenrahmen“ Anforderung erfüllen können, aber Sie können im laufenden Betrieb des neuen Datenrahmen erstellen:

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

ich es schön wäre zustimmen, wenn es gab eine andere Möglichkeit, dies zu kontrollieren, aber ggplot ist schon ein ziemlich starker (und kompliziert) Motor ...

Beachten Sie, dass die Reihenfolge der (1) die Zeilen in dem Datensatz in der Größenordnung von unabhängiger (2) die Ebenen des Faktors. # 2 ist was factor(...,levels=...) ändert, und was ggplot betrachtet, um die Reihenfolge der Facetten zu bestimmen. Doing # 1 (Sortieren der Zeilen des Datenrahmens in einer bestimmten Reihenfolge) ist eine interessante Herausforderung. Ich glaube, ich würde dies tatsächlich erreichen, indem zwei ersten tun # und dann order() oder arrange() Verwendung nach den numerischen Werten des Faktors zu sortieren:

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

Ich kann nicht sofort eine schnelle Art und Weise sieht diesen zu tun ohne Ändern der Reihenfolge der Faktorstufen (Sie könnten es tun und dann die Reihenfolge der Faktorstufen entsprechend zurücksetzen).

Im Allgemeinen basieren Funktionen in R, die von der Reihenfolge der Ebenen einer kategorialen Variablen abhängen, auf der Reihenfolge der Faktorstufen und nicht auf der Reihenfolge der Zeilen im Datensatz. Die obige Antwort gilt allgemeiner.

+0

Könnten Sie bitte genau erklären, was der 'transform'-Aufruf gerade macht? Wenn ich 'transform (Iris, Faktor (Art, levels = c (" virginica "," setosa "," versicolor "))) in R schreibe, gibt es keinen Datenrahmen mit' Species' in der angegebenen Reihenfolge aus 'levels' – user248237dfsf

+0

Ich glaube, du hast den' Species = '-Teil des' transform'-Aufrufs weggelassen ... 'transform' * erzeugt * einen neuen Datenrahmen. –

+0

Ich habe mich vertippt, sorry. Wenn ich transformiere (iris, Species = factor (Art, levels = c ("virginica", "setosa", "versicolor"))) in R, gibt es einen Datenrahmen aus, der folgende Reihenfolge hat: 'setosa, versicolor, virginica ", also verstehe ich nicht, wie transform hier funktioniert. Ihr vollständiger Aufruf erzeugt zwar den gewünschten Graphen, aber ich bin nicht sicher, warum dieser 'transform'-Aufruf nicht die in' levels' angegebene Reihenfolge liefert. danke – user248237dfsf

Verwandte Themen