关于 r:Force geom_bar 在任何情况下都不干扰 x 排序?

Force geom_bar to not interfer with x ordering under any circumstances?

我正在尝试禁用 geom_bar 中 x 变量的字母顺序重新排序。我看到很多关于如何在一个简单的条形图中重新排序 x 变量的问题和答案(例如,这里、这里、这里),但是每个答案都引入了复杂性,如果可以保留顺序

有没有办法将预先安排的 data.frame 传递到 geom_bar() 并停用字母重新排序,以便生成的条形图按照 x 在 data.frame 中出现的顺序简单地显示 x

例子

假设我们有一些数据已经按照应该绘制的方式排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 不按字母顺序重新排序列,以便生成的条形图按照它在 data.frame 中出现的顺序显示 x,这样我们不需要做任何进一步的重新排序?


另外,jou 也可以简单地设置 x 轴的范围,这样你就不用再纠结于因素了:

1
2
3
4
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")相同,但更短。


将其更改为因数,并根据出现情况对其进行排列。

1
2
3
4
5
6
7
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

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