Изменение порядка дискретной шкалы x



Я делаю уклоненную гистограмму с использованием ggplot с дискретной шкалой x, ось x теперь расположена в алфавитном порядке, но мне нужно переставить ее так, чтобы она была упорядочена по значению оси y (т. е. самый высокий бар будет расположен слева).



Я попытался упорядочить или отсортировать, но в результате отсортировать ось x, но не бары соответственно.



Что я сделал не так?

641   5  

5 ответов:

попробуйте вручную установить уровни фактора на оси X. Например:

library(ggplot2)
# Automatic levels
ggplot(mtcars, aes(factor(cyl))) + geom_bar()    

ggplot of the cars dataset with factor levels automatically determined

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

ggplot of the cars dataset with factor levels reordered manually

как указал Джеймс в своем ответе,reorder это идиоматический способ переупорядочения уровней факторов.

mtcars$cyl3 <- with(mtcars, reorder(cyl, cyl, function(x) -length(x)))
ggplot(mtcars, aes(cyl3)) + geom_bar()

ggplot of the cars dataset with factor levels reordered using the reorder function

лучший способ для меня было использование вектора с категориями в порядке мне нужно как до scale_x_discrete. Я думаю, что это довольно простое и понятное решение.

ggplot(mtcars, aes(factor(cyl))) + 
  geom_bar() + 
  scale_x_discrete(limits=c(8,4,6))

enter image description here

можно использовать 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") 

enter image description here

Я понимаю, что это старый, но, возможно, эта функция, которую я создал, полезна кому-то там:

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

    Ничего не найдено.