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ć?
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) )
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
.
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.
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()
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
.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