Подтвердить что ты не робот

Ggplot2: сортировка сюжета

У меня есть 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() 

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Это похоже на то, что вы ищете:

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

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

Ответ 3

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

Как бы то ни было, причина, по которой я с трудом объяснял свою проблему, заключалась в соотношении между (порядком) факторов и coord_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 с координатой. Обратите внимание, что в этом конкретном примере переменная также находится в алфавитном порядке, но указание произвольного порядка уровней внутри xlim() должно работать вообще.

Ответ 4

Вам нужно сделать 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 нет повторяющихся уровней.

Ответ 5

Я не знаю, почему этот вопрос был вновь открыт, но здесь есть вариант с изменением 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()