2010-09-19 9 views
44

Ich habe eine data.frame, das heißt von der höchsten zur niedrigsten sortiert. Zum Beispiel:ggplot2: Sortieren einer Handlung

x <- structure(list(variable = structure(c(10L, 6L, 3L, 4L, 2L, 8L, 
9L, 5L, 1L, 7L), .Label = c("a", "b", "c", "d", "e", "f", "g", 
"h", "i", "j"), class = c("ordered", "factor")), value = c(0.990683229813665, 
0.975155279503106, 0.928571428571429, 0.807453416149068, 0.717391304347826, 
0.388198757763975, 0.357142857142857, 0.201863354037267, 0.173913043478261, 
0.0496894409937888)), .Names = c("variable", "value"), row.names = c(10L, 
6L, 3L, 4L, 2L, 8L, 9L, 5L, 1L, 7L), class = "data.frame") 

ggplot(x, aes(x=variable,y=value)) + geom_bar() + 
scale_y_continuous("",formatter="percent") + coord_flip() 

Jetzt sind die Daten schön und sortiert, aber wenn ich plotte, kommt es sortiert nach Faktor. Es ist nervig, wie repariere ich es?

+1

Mit R Version 3.2.2 bekomme ich einen Fehler: 'scale_y_continuous (" ", formatter =" percent "): unbenutztes Argument (formatter =" percent ")' – Iris

+0

Ja, ich glaube an seine 'scale_y_continuos (labels = percent) 'und Sie müssen auch das Paket' scales' laden. –

+0

Dann habe ich einen neuen Fehler 'Fehler: stat_count() darf nicht mit einem y aesthetic.' – Iris

Antwort

53

Hier sind ein paar Möglichkeiten.

Die erste wird die Dinge, um die für Ordnung, die auf in dem Datenrahmen gesehen:

x$variable <- factor(x$variable, levels=unique(as.character(x$variable))) 

Die zweite Aufträge die auf eine andere Variable (Wert in diesem Fall) auf der Basis Ebenen:

x <- transform(x, variable=reorder(variable, -value)) 
+1

Der zweite lieferte das Ergebnis, das ich suchte, ohne das "-". –

+0

reorder() wird vom gdata-Paket überschrieben. Wenn Sie nicht wissen, warum es nicht funktioniert, könnte das der Grund sein. –

+4

Ich wünschte, ggplot2 würde umgeschrieben werden, um es etwas einfacher zu machen. Ich sortiere schon meine Daten.Rahmen und warum die Reihenfolge nicht durch die Handlung respektiert wird .... – userJT

2

benötigen Sie den x-Faktor in einem ordered Faktor mit der Bestellung Sie möchten, z

x <- data.frame("variable"=letters[1:5], "value"=rnorm(5)) ## example data 
x <- x[with(x,order(-value)), ] ## Sorting 
x$variable <- ordered(x$variable, levels=levels(x$variable)[unclass(x$variable)]) 

ggplot(x, aes(x=variable,y=value)) + geom_bar() + 
    scale_y_continuous("",formatter="percent") + coord_flip() 

Ich kenne keinen besseren Weg, um den Bestellvorgang zu tun. Was ich dort habe, funktioniert nur, wenn es keine doppelten Ebenen für x$variable gibt.

+0

für das Beispiel Das funktioniert I verwendet werden, zur Verfügung gestellt haben, aber es scheint nicht zu meinem eigentlichen Problem zu übersetzen. –

+0

Ich habe das Beispiel geändert tatsächliche Daten zu liefern, die ich mit –

+0

arbeiten bin funktioniert perfekt, wenn ich es versuchen ... – zwol

63

Diese scheint zu sein, was Sie suchen:

g <- ggplot(x, aes(reorder(variable, value), value)) 
g + geom_bar() + scale_y_continuous(formatter="percent") + coord_flip() 

Die reorder() Funktion REORD äh Ihre X-Achse Artikel entsprechend der value von variable.

+6

Wäre gut, eine Erklärung dessen hinzuzufügen, was das tun soll. – naught101

+0

Das war genau das, was ich gesucht habe, danke! – Timothy055

+2

Falls jemand Probleme mit dem 'formatter =' Argument hat: Dies hat sich in neueren Versionen in 'labels = scales :: percent' geändert (siehe http://stackoverflow.com/a/14511974/2761742). –

8

Ich habe mit einem ähnlichen Problem kürzlich ausführlich hier diskutiert zu kämpfen,: Order of legend entries in ggplot2 barplots with coord_flip().

Der Grund, warum es mir schwer fiel, mein Problem klar zu erklären, war die Beziehung zwischen (der Reihenfolge der) Faktoren und coord_flip(), wie es hier der Fall zu sein scheint.

ich das gewünschte Ergebnis durch + xlim(rev(levels(x$variable))) zur ggplot Erklärung hinzu:

ggplot(x, aes(x=variable,y=value)) + geom_bar() + 
scale_y_continuous("",formatter="percent") + coord_flip() 
+ xlim(rev(levels(x$variable))) 

Dies kehrt die Reihenfolge der Faktoren wie in dem ursprünglichen Datenrahmen in der x-Achse gefunden, die die y worden -Achse mit coord_flip(). Beachten Sie, dass in diesem speziellen Beispiel die Variablen zufällig auch in alphabetischer Reihenfolge, sondern eine beliebige Reihenfolge von Ebenen innerhalb xlim() Angabe soll in der Regel arbeiten.