Заставить geom_bar не вмешиваться в порядок x при любых обстоятельствах? - PullRequest
2 голосов
/ 14 марта 2020

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

Есть ли любой способ передать предварительно упорядоченный элемент data.frame на geom_bar() и деактивировать алфавитное переупорядочение, чтобы на итоговой гистограмме просто отображалось значение x в том порядке, в котором x отображается в data.frame?

Пример

Предположим, у нас есть некоторые данные, которые уже упорядочены так, как они должны быть нанесены


df <- structure(list(software = c("Python", "R", "SQL", "Hadoop", "Tableau", 
                                  "Scala", "SAS", "Java", "C", "Spark"), users = c(6440, 5750, 4725,1755, 1660, 1560, 1490, 965, 875, 830)), row.names = c(NA, -10L), class = "data.frame")


#   software users
# 1    Python  6440
# 2         R  5750
# 3       SQL  4725
# 4    Hadoop  1755
# 5   Tableau  1660
# 6     Scala  1560
# 7       SAS  1490
# 8      Java   965
# 9         C   875
# 10    Spark   830



df %>% ggplot(aes(software, users)) + geom_bar(stat = "identity") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Это переупорядочивает x - как мы можем форсировать geom_bar в не переупорядочить столбцы в алфавитном порядке, чтобы на итоговой гистограмме отображалось x в том порядке, в котором она появилась в data.frame, и чтобы нам не приходилось сделать дальнейший заказ?

Ответы [ 2 ]

4 голосов
/ 14 марта 2020

В качестве альтернативы, вы также можете просто установить пределы оси x, что избавит вас от возни с факторами:

df %>% ggplot(aes(software, users)) + 
    geom_col() + 
    scale_x_discrete(limits = unique(df$software))
    theme(axis.text.x = element_text(angle = 90, hjust = 1))

Дружеское напоминание: geom_col() такое же, как geom_bar(stat = "identity"), но короче .

4 голосов
/ 14 марта 2020

Измените его на множитель и расположите их в зависимости от происшествия.

library(dplyr)
library(ggplot2)

df %>% 
  mutate(software = factor(software, levels = unique(software))) %>%
  ggplot() + aes(software, users) + geom_bar(stat = "identity") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

enter image description here

Чтобы изменить порядок без изменения столбца на факторы, мы можем использовать reorder

ggplot(df) + aes(reorder(software, match(software,unique(software))), users) + 
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
...