ggplot2: сортировка сюжета - PullRequest
53 голосов
/ 19 сентября 2010

У меня есть data.frame, который сортируется по возрастанию.Например:

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

Теперь данные хороши и отсортированы, но когда я строю график, они получаются отсортированными по фактору.Раздражает, как это исправить?

Ответы [ 5 ]

74 голосов
/ 21 сентября 2010

Похоже, это то, что вы ищете:

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

Функция reorder() будет переупорядочивать ваши элементы оси x в соответствии с value из variable.

61 голосов
/ 19 сентября 2010

Вот несколько способов.

Первый будет упорядочивать вещи в порядке, указанном во фрейме данных:

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

Второй упорядочивает уровни на основе другой переменной (в данном случае значения):

x <- transform(x, variable=reorder(variable, -value) ) 
9 голосов
/ 05 сентября 2011

Недавно я боролся со связанной проблемой, подробно обсуждаемой здесь: Порядок записей легенды в столбцах ggplot2 с координированием_flip () .

Как оказалось, причина, по которой я с трудом объяснил свою проблему, заключалась в связи между (порядком) факторов иordin_flip (), как, кажется, имеет место здесь.

Я получаю желаемый результат, добавив + xlim(rev(levels(x$variable))) в оператор ggplot:

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

Это меняет порядок факторов , найденных в исходном фрейме данных по оси X, который станет осью Y с координированием_flip (). Обратите внимание, что в этом конкретном примере переменная также имеет алфавитный порядок, но указание произвольного порядка уровней в пределах xlim() должно работать в целом.

2 голосов
/ 19 сентября 2010

Вам нужно превратить x-фактор в фактор ordered с нужным вам порядком, например,

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

Я не знаю лучшего способа выполнить операцию заказа.То, что у меня там, будет работать, только если для x$variable.

не будет дублированных уровней.
1 голос
/ 18 декабря 2018

Я не знаю, почему этот вопрос был вновь открыт, но вот вариант tidyverse.

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() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...