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