ggplot2: sortowanie działki

Mam dane.ramka, która jest sortowana od najwyższej do najniższej. Na przykład:

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() 

Teraz dane są ładne i posortowane, ale kiedy rysuję, wychodzi sortowane według czynników. To denerwujące, jak to naprawić?

 59
Author: Brian Fisher, 2010-09-19

5 answers

Oto kilka sposobów.

Pierwszy uporządkuje rzeczy na podstawie kolejności widocznej w ramce danych:

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

Drugi porządkuje poziomy na podstawie innej zmiennej (wartość w tym przypadku):

x <- transform(x, variable=reorder(variable, -value) ) 
 64
Author: Greg Snow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-19 03:31:22

To chyba jest to, czego szukasz:

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

Funkcja reorder() zmieni kolejność elementów osi x zgodnie z value z variable.

 81
Author: djmuseR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 10:25:13

Ostatnio zmagałem się z pokrewną kwestią, omówioną szczegółowo tutaj: kolejność wpisów legend w ggplot2 z coord_flip () .

Tak się składa, że powodem, dla którego miałem trudności z wyjaśnieniem mojego problemu, była zależność między (kolejnością) czynników i coord_flip (), jak się tu wydaje.

Otrzymuję pożądany rezultat dodając + xlim(rev(levels(x$variable))) do instrukcji ggplot:

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

To odwraca kolejność czynników jak w oryginalna ramka danych w osi x, która stanie się osią y Z coord_flip (). Zauważ, że w tym konkretnym przykładzie zmienna jest również w porządku alfabetycznym, ale określenie dowolnej kolejności poziomów w xlim() powinno działać ogólnie.

 11
Author: MatteoS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:29

Nie wiem dlaczego to pytanie zostało PONOWNIE OTWARTE, ale tutaj jest tidyverse opcja.

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() 
 4
Author: NelsonGon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-18 11:53:58

Musisz przekształcić x-factor w ordered czynnik o żądanej kolejności, np.]}

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()
Nie znam lepszego sposobu na zamówienie. To, co tam mam, zadziała tylko wtedy, gdy nie ma duplikatów poziomów x$variable.
 2
Author: zwol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-19 01:40:25