Изменение порядка дискретной шкалы x
Я делаю уклоненную гистограмму с использованием ggplot с дискретной шкалой x, ось x теперь расположена в алфавитном порядке, но мне нужно переставить ее так, чтобы она была упорядочена по значению оси y (т. е. самый высокий бар будет расположен слева).
Я попытался упорядочить или отсортировать, но в результате отсортировать ось x, но не бары соответственно.
Что я сделал не так?
5 ответов:
попробуйте вручную установить уровни фактора на оси X. Например:
library(ggplot2) # Automatic levels ggplot(mtcars, aes(factor(cyl))) + geom_bar()
# Manual levels cyl_table <- table(mtcars$cyl) cyl_levels <- names(cyl_table)[order(cyl_table)] mtcars$cyl2 <- factor(mtcars$cyl, levels = cyl_levels) # Just to be clear, the above line is no different than: # mtcars$cyl2 <- factor(mtcars$cyl, levels = c("6","4","8")) # You can manually set the levels in whatever order you please. ggplot(mtcars, aes(cyl2)) + geom_bar()
как указал Джеймс в своем ответе,
reorderэто идиоматический способ переупорядочения уровней факторов.mtcars$cyl3 <- with(mtcars, reorder(cyl, cyl, function(x) -length(x))) ggplot(mtcars, aes(cyl3)) + geom_bar()
лучший способ для меня было использование вектора с категориями в порядке мне нужно как до
scale_x_discrete. Я думаю, что это довольно простое и понятное решение.ggplot(mtcars, aes(factor(cyl))) + geom_bar() + scale_x_discrete(limits=c(8,4,6))
можно использовать
reorder:qplot(reorder(factor(cyl),factor(cyl),length),data=mtcars,geom="bar")Edit:
чтобы иметь самый высокий бар слева, вы должны использовать немного kludge:
qplot(reorder(factor(cyl),factor(cyl),function(x) length(x)*-1), data=mtcars,geom="bar")Я ожидал бы, что это также будет иметь отрицательные высоты, но это не так, так что это работает!
Хэдли разрабатывает пакет под названием
forcats. Этот пакет делает задачу намного проще. Вы можете использоватьfct_infreq()Если вы хотите изменить порядок оси x по частоте фактора. В случае сmtcarsпример в этом посте, вы хотите изменить порядок уровнейcylпо частоте каждого уровня. Уровень, который появляется чаще всего остается на левой стороне. Все, что вам нужно-этоfct_infreq().library(ggplot2) library(forcats) ggplot(mtcars, aes(fct_infreq(factor(cyl)))) + geom_bar() + labs(x = "cyl")если вы хотите пойти другим путем, вы можете используйте
fct_rev()вместе сfct_infreq().ggplot(mtcars, aes(fct_rev(fct_infreq(factor(cyl))))) + geom_bar() + labs(x = "cyl")
Я понимаю, что это старый, но, возможно, эта функция, которую я создал, полезна кому-то там:
order_axis<-function(data, axis, column) { # for interactivity with ggplot2 arguments <- as.list(match.call()) col <- eval(arguments$column, data) ax <- eval(arguments$axis, data) # evaluated factors a<-reorder(with(data, ax), with(data, col)) #new_data df<-cbind.data.frame(data) # define new var within(df, do.call("<-",list(paste0(as.character(arguments$axis),"_o"), a))) }теперь с помощью этой функции вы можете интерактивно построить график с ggplot2, например:
ggplot(order_axis(df, AXIS_X, COLUMN_Y), aes(x = AXIS_X_o, y = COLUMN_Y)) + geom_bar(stat = "identity")как видно,
order_axisфункция создает другой фрейм данных с новым столбцом с тем же именем, но с_oВ конце. Этот новый столбец имеет уровни в порядке возрастания, поэтому ggplot2 автоматически строит графики в этом порядке.это несколько ограничен (работает только для символьных или факторных и числовых комбинаций столбцов и в порядке возрастания), но я все еще нахожу его очень полезным для построения графика на ходу.





Comments