web-dev-qa-db-ger.com

ggplot2: Plot sortieren

Ich habe ein data.frame, das vom höchsten zum niedrigsten sortiert wird. Zum Beispiel: 

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(stat="identity") + 
 scale_y_continuous("",label=scales::percent) + coord_flip() 

Die Daten sind jetzt Nizza und sortiert, aber wenn ich plottiere, werden sie nach Faktoren sortiert ausgegeben. Es ist nervig, wie kann ich das beheben?

48

Hier sind einige Möglichkeiten.

Die erste ordnet die Dinge auf der Grundlage der Reihenfolge im Datenrahmen an:

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

Die zweite ordnet die Ebenen anhand einer anderen Variablen (Wert in diesem Fall) an:

x <- transform(x, variable=reorder(variable, -value) ) 
56
Greg Snow

Das scheint es zu sein, wonach Sie suchen:

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

Die Funktion reorder() ordnet Ihre x-Achsenelemente entsprechend der value von variable neu an.

69
djmuseR

Ich habe vor kurzem mit einem verwandten Problem gekämpft, das hier ausführlich besprochen wird: Reihenfolge der Legendeneinträge in ggplot2-Barplots mit coord_flip () .

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

Ich erhalte das gewünschte Ergebnis durch Hinzufügen von + xlim(rev(levels(x$variable))) zur ggplot-Anweisung:

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 um, wie sie im ursprünglichen Datenrahmen in der x-Achse zu finden sind, die mit coord_flip () zur y-Achse wird. Beachten Sie, dass in diesem speziellen Beispiel die Variable zufällig in alphabetischer Reihenfolge ist. Die Angabe einer beliebigen Reihenfolge von Ebenen in xlim() sollte jedoch im Allgemeinen funktionieren.

9
MatteoS

Sie müssen den x-Faktor in einen ordered-Faktor mit der gewünschten Reihenfolge umwandeln, 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 durchzuführen. Was ich dort habe, funktioniert nur, wenn für x$variable keine doppelten Ebenen vorhanden sind.

2
zwol

Ich weiß nicht, warum diese Frage erneut geöffnet wurde, aber hier ist eine tidyverse-Option.

x %>% 
  arrange(desc(value)) %>%
  mutate(variable=fct_reorder(variable,value)) %>% 
ggplot(aes(variable,value,fill=variable)) + geom_bar(stat="identity") + 
  scale_y_continuous("",label=scales::percent) + coord_flip() 
1
NelsonGon